RTALogger 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (38) hide show
  1. checksums.yaml +4 -4
  2. data/.idea/.gitignore +2 -0
  3. data/.idea/.rakeTasks +7 -0
  4. data/.idea/RTALogger.iml +36 -0
  5. data/.idea/misc.xml +7 -0
  6. data/.idea/modules.xml +8 -0
  7. data/.idea/vcs.xml +6 -0
  8. data/Gemfile +1 -0
  9. data/Gemfile.lock +18 -3
  10. data/README.md +37 -1
  11. data/RTALogger.gemspec +1 -0
  12. data/lib/RTALogger.rb +2 -4
  13. data/lib/RTALogger/version.rb +1 -1
  14. data/lib/{factory/origin/log_factory_file_logger.rb → log_factory_file_logger.rb} +3 -2
  15. data/lib/log_factory_log_formatter.rb +12 -0
  16. data/lib/{factory/origin/log_factory_manager.rb → log_factory_manager.rb} +1 -3
  17. data/lib/{factory/origin/log_factory_propagator.rb → log_factory_propagator.rb} +1 -2
  18. data/lib/{factory/origin/log_factory_record.rb → log_factory_record.rb} +1 -1
  19. data/lib/{factory/origin/log_factory_repository.rb → log_factory_repository.rb} +8 -9
  20. data/lib/{factory/origin/log_factory_topic.rb → log_factory_topic.rb} +1 -1
  21. data/lib/log_formatter.rb +1 -1
  22. data/lib/log_formatter_json.rb +3 -1
  23. data/lib/log_formatter_text.rb +9 -7
  24. data/lib/log_manager.rb +40 -15
  25. data/lib/log_propagator.rb +44 -45
  26. data/lib/log_record.rb +27 -28
  27. data/lib/log_repository.rb +1 -3
  28. data/lib/log_repository_console.rb +2 -3
  29. data/lib/log_repository_file.rb +4 -5
  30. data/lib/log_repository_udp.rb +1 -2
  31. data/lib/log_severity.rb +1 -1
  32. data/lib/log_topic.rb +3 -5
  33. data/lib/rta_logger_config.json +32 -0
  34. data/lib/sample.rb +37 -0
  35. metadata +30 -10
  36. data/lib/factory/origin/log_factory_log_formatter.rb +0 -11
  37. data/lib/log_test.rb +0 -41
  38. data/lib/log_test_db.rb +0 -59
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e8102f5e6bfb81e09e529d98b34039304aa7376d553e0df71e974a2eeaf6818d
4
- data.tar.gz: 7a6558fa4df04b8bbaede48620644b7b85de448d96b7e93340d30f018a872461
3
+ metadata.gz: 5cd821ed8beebbda5bfd6aff1088372642f5f20012c7f5d6ca8b2d59cc8dee42
4
+ data.tar.gz: 8dbf6b01f03b98525acade15eaebece1e500dfbc610f2d9cbda5e760df0e048b
5
5
  SHA512:
6
- metadata.gz: 590a74703f4605c4a0df2e3a5a1997bf1c0209182b961ef74769f4c037f7fefb8770240d317e6017d3cf9ae30f1fc1cbd4e489c6e5c7f083b36f04b6d6f64bc6
7
- data.tar.gz: 1dd9d109f63173420be1bbb6306d76eda10140c4474aa8b4de27f46ef7dbadceec58d5ba8816b03fa53de2cb6ee6b793ae3726ade97728aa3de55ec592e30255
6
+ metadata.gz: 7a1e77c33e3fb301780bb6d4a0b254701ab918403ee8705e19bda759b2c0ce56b1e1cf76c18012c195b5c3b28267dea524bbe3db303f7a9fb9dca58662fe9a2f
7
+ data.tar.gz: fd81ab07bb1a3c79e00e425298068e4cfa357208e4173f157a156e5cdefcb044f456604cfc0c3b9d0f37342e672d47636ffd75ceb4b5ef866a47f8f7db9bc7aa
@@ -0,0 +1,2 @@
1
+ # Default ignored files
2
+ /workspace.xml
@@ -0,0 +1,7 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <Settings><!--This file was automatically generated by Ruby plugin.
3
+ You are allowed to:
4
+ 1. Remove rake task
5
+ 2. Add existing rake tasks
6
+ To add existing rake tasks automatically delete this file and reload the project.
7
+ --><RakeGroup description="" fullCmd="" taksId="rake"><RakeTask description="Build RTALogger-0.1.0.gem into the pkg directory" fullCmd="build" taksId="build" /><RakeTask description="Remove any temporary products" fullCmd="clean" taksId="clean" /><RakeTask description="Remove any generated files" fullCmd="clobber" taksId="clobber" /><RakeTask description="Build and install RTALogger-0.1.0.gem into system gems" fullCmd="install" taksId="install" /><RakeGroup description="" fullCmd="" taksId="install"><RakeTask description="Build and install RTALogger-0.1.0.gem into system gems without network access" fullCmd="install:local" taksId="local" /></RakeGroup><RakeTask description="Create tag v0.1.0 and build and push RTALogger-0.1.0.gem to https://www.rubygems.org" fullCmd="release[remote]" taksId="release[remote]" /><RakeTask description="Run RSpec code examples" fullCmd="spec" taksId="spec" /></RakeGroup></Settings>
@@ -0,0 +1,36 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <module type="RUBY_MODULE" version="4">
3
+ <component name="ModuleRunConfigurationManager">
4
+ <shared />
5
+ </component>
6
+ <component name="NewModuleRootManager">
7
+ <content url="file://$MODULE_DIR$" />
8
+ <orderEntry type="inheritedJdk" />
9
+ <orderEntry type="sourceFolder" forTests="false" />
10
+ <orderEntry type="library" scope="PROVIDED" name="activesupport (v6.0.3.4, ruby-2.6.3-p62) [gem]" level="application" />
11
+ <orderEntry type="library" scope="PROVIDED" name="bundler (v2.1.4, ruby-2.6.3-p62) [gem]" level="application" />
12
+ <orderEntry type="library" scope="PROVIDED" name="concurrent-ruby (v1.1.7, ruby-2.6.3-p62) [gem]" level="application" />
13
+ <orderEntry type="library" scope="PROVIDED" name="cool.io (v1.7.0, ruby-2.6.3-p62) [gem]" level="application" />
14
+ <orderEntry type="library" scope="PROVIDED" name="diff-lcs (v1.4.4, ruby-2.6.3-p62) [gem]" level="application" />
15
+ <orderEntry type="library" scope="PROVIDED" name="fluentd (v1.11.4, ruby-2.6.3-p62) [gem]" level="application" />
16
+ <orderEntry type="library" scope="PROVIDED" name="http_parser.rb (v0.6.0, ruby-2.6.3-p62) [gem]" level="application" />
17
+ <orderEntry type="library" scope="PROVIDED" name="i18n (v1.8.5, ruby-2.6.3-p62) [gem]" level="application" />
18
+ <orderEntry type="library" scope="PROVIDED" name="jbuilder (v2.10.1, ruby-2.6.3-p62) [gem]" level="application" />
19
+ <orderEntry type="library" scope="PROVIDED" name="minitest (v5.14.2, ruby-2.6.3-p62) [gem]" level="application" />
20
+ <orderEntry type="library" scope="PROVIDED" name="msgpack (v1.3.3, ruby-2.6.3-p62) [gem]" level="application" />
21
+ <orderEntry type="library" scope="PROVIDED" name="rake (v12.3.3, ruby-2.6.3-p62) [gem]" level="application" />
22
+ <orderEntry type="library" scope="PROVIDED" name="rspec (v3.10.0, ruby-2.6.3-p62) [gem]" level="application" />
23
+ <orderEntry type="library" scope="PROVIDED" name="rspec-core (v3.10.0, ruby-2.6.3-p62) [gem]" level="application" />
24
+ <orderEntry type="library" scope="PROVIDED" name="rspec-expectations (v3.10.0, ruby-2.6.3-p62) [gem]" level="application" />
25
+ <orderEntry type="library" scope="PROVIDED" name="rspec-mocks (v3.10.0, ruby-2.6.3-p62) [gem]" level="application" />
26
+ <orderEntry type="library" scope="PROVIDED" name="rspec-support (v3.10.0, ruby-2.6.3-p62) [gem]" level="application" />
27
+ <orderEntry type="library" scope="PROVIDED" name="serverengine (v2.2.2, ruby-2.6.3-p62) [gem]" level="application" />
28
+ <orderEntry type="library" scope="PROVIDED" name="sigdump (v0.2.4, ruby-2.6.3-p62) [gem]" level="application" />
29
+ <orderEntry type="library" scope="PROVIDED" name="strptime (v0.2.5, ruby-2.6.3-p62) [gem]" level="application" />
30
+ <orderEntry type="library" scope="PROVIDED" name="thread_safe (v0.3.6, ruby-2.6.3-p62) [gem]" level="application" />
31
+ <orderEntry type="library" scope="PROVIDED" name="tzinfo (v1.2.7, ruby-2.6.3-p62) [gem]" level="application" />
32
+ <orderEntry type="library" scope="PROVIDED" name="tzinfo-data (v1.2020.4, ruby-2.6.3-p62) [gem]" level="application" />
33
+ <orderEntry type="library" scope="PROVIDED" name="yajl-ruby (v1.4.1, ruby-2.6.3-p62) [gem]" level="application" />
34
+ <orderEntry type="library" scope="PROVIDED" name="zeitwerk (v2.4.1, ruby-2.6.3-p62) [gem]" level="application" />
35
+ </component>
36
+ </module>
@@ -0,0 +1,7 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="JavaScriptSettings">
4
+ <option name="languageLevel" value="ES6" />
5
+ </component>
6
+ <component name="ProjectRootManager" version="2" project-jdk-name="ruby-2.6.3-p62" project-jdk-type="RUBY_SDK" />
7
+ </project>
@@ -0,0 +1,8 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="ProjectModuleManager">
4
+ <modules>
5
+ <module fileurl="file://$PROJECT_DIR$/.idea/RTALogger.iml" filepath="$PROJECT_DIR$/.idea/RTALogger.iml" />
6
+ </modules>
7
+ </component>
8
+ </project>
@@ -0,0 +1,6 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="VcsDirectoryMappings">
4
+ <mapping directory="$PROJECT_DIR$" vcs="Git" />
5
+ </component>
6
+ </project>
data/Gemfile CHANGED
@@ -5,3 +5,4 @@ gemspec
5
5
 
6
6
  gem "rake", "~> 12.0"
7
7
  gem "rspec", "~> 3.0"
8
+ gem "jbuilder"
@@ -1,12 +1,19 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- RTALogger (0.1.0)
4
+ RTALogger (0.1.1)
5
5
  fluentd (~> 1.11, >= 1.11.4)
6
+ jbuilder (~> 2.10)
6
7
 
7
8
  GEM
8
9
  remote: https://rubygems.org/
9
10
  specs:
11
+ activesupport (6.0.3.4)
12
+ concurrent-ruby (~> 1.0, >= 1.0.2)
13
+ i18n (>= 0.7, < 2)
14
+ minitest (~> 5.1)
15
+ tzinfo (~> 1.1)
16
+ zeitwerk (~> 2.2, >= 2.2.2)
10
17
  concurrent-ruby (1.1.7)
11
18
  cool.io (1.7.0)
12
19
  diff-lcs (1.4.4)
@@ -21,6 +28,11 @@ GEM
21
28
  tzinfo-data (~> 1.0)
22
29
  yajl-ruby (~> 1.0)
23
30
  http_parser.rb (0.6.0)
31
+ i18n (1.8.5)
32
+ concurrent-ruby (~> 1.0)
33
+ jbuilder (2.10.1)
34
+ activesupport (>= 5.0.0)
35
+ minitest (5.14.2)
24
36
  msgpack (1.3.3)
25
37
  rake (12.3.3)
26
38
  rspec (3.10.0)
@@ -40,17 +52,20 @@ GEM
40
52
  sigdump (~> 0.2.2)
41
53
  sigdump (0.2.4)
42
54
  strptime (0.2.5)
43
- tzinfo (2.0.2)
44
- concurrent-ruby (~> 1.0)
55
+ thread_safe (0.3.6)
56
+ tzinfo (1.2.7)
57
+ thread_safe (~> 0.1)
45
58
  tzinfo-data (1.2020.4)
46
59
  tzinfo (>= 1.0.0)
47
60
  yajl-ruby (1.4.1)
61
+ zeitwerk (2.4.1)
48
62
 
49
63
  PLATFORMS
50
64
  ruby
51
65
 
52
66
  DEPENDENCIES
53
67
  RTALogger!
68
+ jbuilder
54
69
  rake (~> 12.0)
55
70
  rspec (~> 3.0)
56
71
 
data/README.md CHANGED
@@ -22,7 +22,43 @@ Or install it yourself as:
22
22
 
23
23
  ## Usage
24
24
 
25
- TODO: Write usage instructions here
25
+ require_relative 'log_factory_manager'
26
+ require_relative 'log_factory_repository'
27
+
28
+ controller_name = 'test_controller'
29
+ userID = 5
30
+
31
+ # create log manager instance
32
+ # this could be a global variable declared in application level
33
+ log_manager = RTALogger::LogFactory.log_manager_instance
34
+
35
+ # set log manage application name (hard code)
36
+ log_manager.app_name = 'myTestApp'
37
+
38
+ # load log manager configuration from a json config file
39
+ log_manager.config_use_json_file('rta_logger_config.json')
40
+
41
+ # add log repository to log manager
42
+ #log_manager.propagator.add_log_repository(RTALogger::LogFactory.new_log_repository_console)
43
+
44
+ # add new topic to log manager
45
+ # use this api to get a new log topic instance
46
+ # this api could be called in entry point of each service or class initialize method
47
+ topic = log_manager.add_topic(controller_name)
48
+
49
+ # add log information to log topic
50
+ topic.debug(userID, 'Controller Name=', controller_name, 'debug')
51
+ topic.info(userID, 'Controller Name=', controller_name, 'information')
52
+ topic.warning(userID, 'Controller Name=', controller_name, 'warning')
53
+ topic.error(userID, 'Controller Name=', controller_name, 'error')
54
+ topic.fatal(userID, 'Controller Name=', controller_name, 'fatal')
55
+ topic.unknown(userID, 'Controller Name=', controller_name, 'unknown')
56
+
57
+ # update specific topic log level if necessary
58
+ # log_manager.update_topic_level(controller_name, RTALogger::LogSeverity::INFO)
59
+
60
+ # update all topics log level if necessary
61
+ # log_manager.update_all_topics_log_level(RTALogger::LogSeverity::INFO)
26
62
 
27
63
  ## Development
28
64
 
@@ -28,4 +28,5 @@ Gem::Specification.new do |spec|
28
28
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
29
29
  spec.require_paths = ["lib"]
30
30
  spec.add_dependency "fluentd", "~> 1.11", ">= 1.11.4"
31
+ spec.add_dependency "jbuilder", "~> 2.10"
31
32
  end
@@ -1,6 +1,4 @@
1
- require "RTALogger/version"
2
-
1
+ require 'RTALogger/version'
2
+ # main namespace of the log manager
3
3
  module RTALogger
4
- class Error < StandardError; end
5
- # Your code goes here...
6
4
  end
@@ -1,3 +1,3 @@
1
1
  module RTALogger
2
- VERSION = "0.1.0"
2
+ VERSION = '0.1.1'.freeze
3
3
  end
@@ -1,13 +1,14 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'logger'
3
4
 
4
5
  module RTALogger
5
6
  # this module generates object instance
6
7
  module LogFactory
7
- def self.new_file_logger(file_path = 'log.txt', period = 'daily', shift_size = 1048576)
8
+ def self.new_file_logger(file_path = 'log.txt', period = 'daily', shift_size = 1_048_576)
8
9
  @ruby_logger = Logger.new(file_path, period, shift_size)
9
10
  @ruby_logger.level = Logger::Severity::DEBUG
10
- @ruby_logger.formatter = proc do |severity, datetime, progname, msg|
11
+ @ruby_logger.formatter = proc do |_severity, _datetime, _progname, msg|
11
12
  "#{msg}\n"
12
13
  end
13
14
  @ruby_logger
@@ -0,0 +1,12 @@
1
+ require_relative 'log_formatter_text'
2
+ require_relative 'log_formatter_json'
3
+
4
+ module RTALogger
5
+ # Log factory to get new instance of log formatter
6
+ module LogFactory
7
+ def self.log_formatter_default
8
+ RTALogger::LogFormatterJSON.new
9
+ # RTALogger::LogFormatterText.new
10
+ end
11
+ end
12
+ end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative '../../log_manager'
3
+ require_relative 'log_manager'
4
4
 
5
5
  module RTALogger
6
6
  # this module generates object instance
@@ -8,7 +8,5 @@ module RTALogger
8
8
  def self.log_manager_instance
9
9
  RTALogger::LogManager.instance
10
10
  end
11
-
12
-
13
11
  end
14
12
  end
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative '../../log_propagator'
4
- #require_relative './log_repository_console'
3
+ require_relative 'log_propagator'
5
4
 
6
5
  module RTALogger
7
6
  # this module generates object instance
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative '../../log_record'
3
+ require_relative 'log_record'
4
4
 
5
5
  module RTALogger
6
6
  # this module generates object instance
@@ -1,9 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative '../../log_repository_console'
4
- require_relative '../../log_repository_file'
5
- require_relative '../../log_repository_udp'
6
- #require_relative '../../log_repository_db'
3
+ require_relative 'log_repository_console'
4
+ require_relative 'log_repository_file'
5
+ require_relative 'log_repository_udp'
7
6
 
8
7
  module RTALogger
9
8
  # this module generates object instance
@@ -12,14 +11,14 @@ module RTALogger
12
11
  LogRepositoryConsole.new
13
12
  end
14
13
 
15
- def self.new_log_repository_file(file_path = 'log.txt', period = 'daily', shift_size = 1048576)
14
+ def self.new_log_repository_file(file_path = 'log.txt', period = 'daily', shift_size = 1_048_576)
16
15
  LogRepositoryFile.new(file_path, period, shift_size)
17
16
  end
18
17
 
19
18
  def self.load_log_repository_file(config_json)
20
19
  file_path = config_json['File_Path'].to_s
21
20
  period = config_json['Roll_Period'].to_s
22
- shift_size = config_json['Roll_Size'].nil? ? 1048576 : config_json['Roll_Size'].to_i
21
+ shift_size = config_json['Roll_Size'].nil? ? 1_048_576 : config_json['Roll_Size'].to_i
23
22
  ::RTALogger::LogFactory.new_log_repository_file(file_path, period, shift_size)
24
23
  end
25
24
 
@@ -35,9 +34,9 @@ module RTALogger
35
34
 
36
35
  def self.create_repository(type, config_json)
37
36
  result = nil
38
- result = new_log_repository_console if type.to_s.upcase.eql?('Console'.upcase)
39
- result = load_log_repository_file(config_json) if type.to_s.upcase.eql?('File'.upcase)
40
- result = load_log_repository_udp(config_json) if type.to_s.upcase.eql?('UDP'.upcase)
37
+ result = new_log_repository_console if type.to_s.casecmp('Console').zero?
38
+ result = load_log_repository_file(config_json) if type.to_s.casecmp('File').zero?
39
+ result = load_log_repository_udp(config_json) if type.to_s.casecmp('UDP').zero?
41
40
  result
42
41
  end
43
42
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative '../../log_topic'
3
+ require_relative 'log_topic'
4
4
 
5
5
  module RTALogger
6
6
  # this module generates object instance
@@ -1,8 +1,8 @@
1
1
  module RTALogger
2
+ # Log Formatter base class
2
3
  class LogFormatter
3
4
  def format(log_record)
4
5
  log_record.to_s
5
6
  end
6
7
  end
7
8
  end
8
-
@@ -2,12 +2,14 @@ require 'jbuilder'
2
2
  require_relative 'log_formatter'
3
3
 
4
4
  module RTALogger
5
+ # json formatter which receive log_record and
6
+ # returns it's data as json string
5
7
  class LogFormatterJSON
6
8
  def format(log_record)
7
9
  return '' unless log_record
8
10
 
9
11
  jb = Jbuilder.new do |json|
10
- json.occurred_at log_record.occurred_at.strftime("%F %H:%M:%S:%3N")
12
+ json.occurred_at log_record.occurred_at.strftime('%F %H:%M:%S:%3N')
11
13
  json.app_name log_record.app_name
12
14
  json.topic_title log_record.topic_title
13
15
  json.context_id log_record.context_id
@@ -1,16 +1,18 @@
1
1
  require_relative 'log_formatter'
2
2
 
3
3
  module RTALogger
4
+ # text formatter which receive log_record and
5
+ # returns it's data as delimited text string
4
6
  class LogFormatterText < LogFormatter
5
- def format(log_record)
7
+ def format(log_record, delimiter = '|')
6
8
  return '' unless log_record
7
9
 
8
- result = log_record.occurred_at.strftime("%F %H:%M:%S:%3N")
9
- result << '|' << log_record.app_name
10
- result << '|' << log_record.topic_title
11
- result << '|' << log_record.context_id
12
- result << '|' << log_record.severity
13
- result << '|' << log_record.message.join(' ').gsub('|' , '$<$')
10
+ result = log_record.occurred_at.strftime('%F %H:%M:%S:%3N')
11
+ result << delimiter << log_record.app_name
12
+ result << delimiter << log_record.topic_title
13
+ result << delimiter << log_record.context_id
14
+ result << delimiter << log_record.severity
15
+ result << delimiter << log_record.message.join(' ').gsub(delimiter, '$<$')
14
16
 
15
17
  result
16
18
  end
@@ -1,10 +1,10 @@
1
1
  require 'date'
2
2
  require 'thread'
3
3
  require 'singleton'
4
- require_relative 'factory/origin/log_factory_propagator'
5
- require_relative 'factory/origin/log_factory_repository'
6
- require_relative 'factory/origin/log_factory_topic'
7
- require_relative './log_severity'
4
+ require_relative 'log_factory_propagator'
5
+ require_relative 'log_factory_repository'
6
+ require_relative 'log_factory_topic'
7
+ require_relative 'log_severity'
8
8
 
9
9
  # the module will contain all logger requirements
10
10
  module RTALogger
@@ -36,16 +36,18 @@ module RTALogger
36
36
  @flush_scheduler.run
37
37
  end
38
38
 
39
- def config(config_file_name)
40
- config_json = load_config_from_file(config_file_name)
41
- raise 'json config not available' unless config_json
42
- @enable = config_json['Enable'].nil? ? true : config_json['Enable']
43
- @app_name = config_json['App_Name'] if config_json['App_Name'].present?
44
- @default_log_level = config_json['Log_Severity'] if config_json['Log_Severity'].present?
45
- @buffer_siz = config_json['Buffer_Size'] if config_json['Buffer_Size'].present?
46
- @flush_wait_time = config_json['Flush_Wait_Seconds'] if config_json['Flush_Wait_Seconds'].present?
39
+ def config_use_json_file(config_file_name)
40
+ config_json = load_config_from_json_file(config_file_name)
41
+ apply_config(config_json)
42
+ rescue StandardError => e
43
+ puts e.message
47
44
  @propagator.drop_all_repositories
48
- config_json['Repos']&.each { |item| @propagator.load_log_repository(item) }
45
+ @propagator.add_log_repository(LogFactory.new_log_repository_console)
46
+ end
47
+
48
+ def config_use_json_string(config_string)
49
+ config_json = load_config_from_json_string(config_file_name)
50
+ apply_config(config_json)
49
51
  rescue StandardError => e
50
52
  puts e.message
51
53
  @propagator.drop_all_repositories
@@ -55,6 +57,7 @@ module RTALogger
55
57
  attr_accessor :enable
56
58
  attr_accessor :app_name
57
59
  attr_reader :propagator
60
+ attr_reader :default_log_level
58
61
 
59
62
  def add_topic(topic_title, log_level = @default_log_level)
60
63
  @topic_semaphore.synchronize {
@@ -81,10 +84,21 @@ module RTALogger
81
84
 
82
85
  private
83
86
 
84
- def load_config_from_file(config_file_name)
87
+ def load_config_from_json_file(config_file_name)
85
88
  config_file = File.open config_file_name
86
89
  config_json = JSON.load config_file
87
- config_json = config_json['RTALogger']
90
+ config_json = extract_config(config_json)
91
+ config_json
92
+ end
93
+
94
+ def load_config_from_json_string(config_string)
95
+ config_json = JSON.parse(config_string)
96
+ config_json = extract_config(config_json)
97
+ config_json
98
+ end
99
+
100
+ def extract_config(json_data)
101
+ config_json = json_data['RTALogger']
88
102
  raise 'RTALogger configuration not found!' unless config_json
89
103
  raise 'Log_Managers section does not exists json configuration' unless config_json['Log_Managers']
90
104
  raise 'No config manager defined in json configuration' unless config_json['Log_Managers'].count.positive?
@@ -97,6 +111,17 @@ module RTALogger
97
111
  config_json
98
112
  end
99
113
 
114
+ def apply_config(config_json)
115
+ raise 'json config not available' unless config_json
116
+ @enable = config_json['Enable'].nil? ? true : config_json['Enable']
117
+ @app_name = config_json['App_Name'] if config_json['App_Name'].present?
118
+ @default_log_level = config_json['Log_Severity'] if config_json['Log_Severity'].present?
119
+ @buffer_siz = config_json['Buffer_Size'] if config_json['Buffer_Size'].present?
120
+ @flush_wait_time = config_json['Flush_Wait_Seconds'] if config_json['Flush_Wait_Seconds'].present?
121
+ @propagator.drop_all_repositories
122
+ config_json['Repos']&.each { |item| @propagator.load_log_repository(item) }
123
+ end
124
+
100
125
  def initialize_flush_scheduler
101
126
  @flush_scheduler = Thread.new do
102
127
  loop do
@@ -1,45 +1,44 @@
1
- require 'thread'
2
- require_relative './log_repository'
3
-
4
- module RTALogger
5
- # propagate log records to multiple log repositories
6
- class LogPropagator
7
- def initialize
8
- @semaphore = Mutex.new
9
- @log_records = []
10
- @log_repositories = []
11
- end
12
-
13
- def add_log(log_record)
14
- @semaphore.synchronize { @log_records.push(log_record.dup) }
15
- end
16
-
17
- def add_log_repository(log_repository)
18
- return unless log_repository.is_a? RTALogger::LogRepository
19
- @log_repositories.push(log_repository) unless @log_repositories.include?(log_repository)
20
- end
21
-
22
- def load_log_repository(config_json)
23
- type = config_json['Type']
24
- return if type.to_s.strip.empty?
25
- enable = config_json['Enable'].nil? ? true : config_json['Enable']
26
- return unless enable
27
-
28
- log_repository = ::RTALogger::LogFactory.create_repository(type, config_json)
29
- add_log_repository(log_repository)
30
- end
31
-
32
- def drop_all_repositories
33
- @semaphore.synchronize { @log_repositories.clear }
34
- end
35
-
36
- def propagate
37
- @semaphore.synchronize do
38
- @log_repositories.each do |log_repository|
39
- log_repository.add_log_records(@log_records)
40
- end
41
- @log_records.clear
42
- end
43
- end
44
- end
45
- end
1
+ require_relative 'log_repository'
2
+
3
+ module RTALogger
4
+ # propagate log records to multiple log repositories
5
+ class LogPropagator
6
+ def initialize
7
+ @semaphore = Mutex.new
8
+ @log_records = []
9
+ @log_repositories = []
10
+ end
11
+
12
+ def add_log(log_record)
13
+ @semaphore.synchronize { @log_records.push(log_record.dup) }
14
+ end
15
+
16
+ def add_log_repository(log_repository)
17
+ return unless log_repository.is_a? RTALogger::LogRepository
18
+ @log_repositories.push(log_repository) unless @log_repositories.include?(log_repository)
19
+ end
20
+
21
+ def load_log_repository(config_json)
22
+ type = config_json['Type']
23
+ return if type.to_s.strip.empty?
24
+ enable = config_json['Enable'].nil? ? true : config_json['Enable']
25
+ return unless enable
26
+
27
+ log_repository = ::RTALogger::LogFactory.create_repository(type, config_json)
28
+ add_log_repository(log_repository)
29
+ end
30
+
31
+ def drop_all_repositories
32
+ @semaphore.synchronize { @log_repositories.clear }
33
+ end
34
+
35
+ def propagate
36
+ @semaphore.synchronize do
37
+ @log_repositories.each do |log_repository|
38
+ log_repository.add_log_records(@log_records)
39
+ end
40
+ @log_records.clear
41
+ end
42
+ end
43
+ end
44
+ end
@@ -1,28 +1,27 @@
1
- require 'date'
2
-
3
- module RTALogger
4
- # log data structure
5
- class LogRecord
6
- def initialize(log_topic, context_id, severity, *message)
7
- @log_topic = log_topic
8
- @context_id = context_id
9
- @severity = severity
10
- @message = message
11
- @occurred_at = DateTime.now
12
- end
13
-
14
- attr_reader :context_id
15
- attr_reader :severity
16
- attr_reader :message
17
- attr_reader :occurred_at
18
-
19
- def app_name
20
- @log_topic.log_manager.app_name
21
- end
22
-
23
- def topic_title
24
- @log_topic.topic_title
25
- end
26
- end
27
- end
28
-
1
+ require 'date'
2
+
3
+ module RTALogger
4
+ # log data structure
5
+ class LogRecord
6
+ def initialize(log_topic, context_id, severity, *message)
7
+ @log_topic = log_topic
8
+ @context_id = context_id
9
+ @severity = severity
10
+ @message = message
11
+ @occurred_at = DateTime.now
12
+ end
13
+
14
+ attr_reader :context_id
15
+ attr_reader :severity
16
+ attr_reader :message
17
+ attr_reader :occurred_at
18
+
19
+ def app_name
20
+ @log_topic.log_manager.app_name
21
+ end
22
+
23
+ def topic_title
24
+ @log_topic.topic_title
25
+ end
26
+ end
27
+ end
@@ -1,5 +1,3 @@
1
- require 'thread'
2
-
3
1
  module RTALogger
4
2
  # base log repository class
5
3
  class LogRepository
@@ -28,4 +26,4 @@ module RTALogger
28
26
  attr_reader :log_records
29
27
  attr_reader :semaphore
30
28
  end
31
- end
29
+ end
@@ -1,5 +1,5 @@
1
1
  require_relative 'log_repository'
2
- require_relative 'factory/origin/log_factory_log_formatter'
2
+ require_relative 'log_factory_log_formatter'
3
3
 
4
4
  module RTALogger
5
5
  # show log items on console out put
@@ -7,7 +7,7 @@ module RTALogger
7
7
  def initialize
8
8
  super
9
9
 
10
- @formatter = RTALogger::LogFactory::log_formatter_default
10
+ @formatter = RTALogger::LogFactory.log_formatter_default
11
11
  end
12
12
 
13
13
  protected
@@ -18,6 +18,5 @@ module RTALogger
18
18
  end
19
19
  super
20
20
  end
21
-
22
21
  end
23
22
  end
@@ -1,15 +1,15 @@
1
1
  require 'logger'
2
2
  require_relative 'log_repository'
3
- require_relative 'factory/origin/log_factory_file_logger'
4
- require_relative 'factory/origin/log_factory_log_formatter'
3
+ require_relative 'log_factory_file_logger'
4
+ require_relative 'log_factory_log_formatter'
5
5
 
6
6
  module RTALogger
7
7
  # show log items on console out put
8
8
  class LogRepositoryFile < LogRepository
9
- def initialize(file_path = 'log.txt', period = 'daily', shift_size = 1048576)
9
+ def initialize(file_path = 'log.txt', period = 'daily', shift_size = 1_048_576)
10
10
  super()
11
11
  @file_logger = RTALogger::LogFactory.new_file_logger(file_path, period, shift_size)
12
- @formatter = RTALogger::LogFactory::log_formatter_default
12
+ @formatter = RTALogger::LogFactory.log_formatter_default
13
13
  end
14
14
 
15
15
  protected
@@ -20,6 +20,5 @@ module RTALogger
20
20
  end
21
21
  super
22
22
  end
23
-
24
23
  end
25
24
  end
@@ -15,11 +15,10 @@ module RTALogger
15
15
  semaphore.synchronize do
16
16
  u1 = UDPSocket.new
17
17
  u1.bind(@host, @port)
18
- @log_records.each { |log_record| u1.send log_record.to_s, 0, @host, @port}
18
+ @log_records.each { |log_record| u1.send log_record.to_s, 0, @host, @port }
19
19
  u1.close
20
20
  end
21
21
  super
22
22
  end
23
-
24
23
  end
25
24
  end
@@ -9,7 +9,7 @@ module RTALogger
9
9
  WARN = 2
10
10
  # A handleable error condition.
11
11
  ERROR = 3
12
- # An unhandleable error that results in a program crash.
12
+ # An un-handleable error that results in a program crash.
13
13
  FATAL = 4
14
14
  # An unknown message that should always be logged.
15
15
  UNKNOWN = 5
@@ -1,10 +1,8 @@
1
- # topic
2
-
3
- require_relative './log_severity'
4
- require_relative 'factory/origin/log_factory_record'
1
+ require_relative 'log_severity'
2
+ require_relative 'log_factory_record'
5
3
 
6
4
  module RTALogger
7
- # the main class to logging data
5
+ # the main class to logging data as topic
8
6
  class LogTopic
9
7
  include LogSeverity
10
8
  include RTALogger::LogFactory
@@ -0,0 +1,32 @@
1
+ {
2
+ "RTALogger":
3
+ {
4
+ "Default_Manager": "Develop",
5
+ "Log_Managers":
6
+ [
7
+ {
8
+ "Manager_Name": "Develop",
9
+ "Enable": true,
10
+ "App_Name": "TestApp",
11
+ "Log_Severity": 2,
12
+ "Buffer_Size": 100,
13
+ "Flush_Wait_Seconds": 15,
14
+ "Formatter" : "JSON",
15
+ "Repos":
16
+ [
17
+ {
18
+ "Enable": true,
19
+ "Type": "Console"
20
+ },
21
+ {
22
+ "Enable": false,
23
+ "Type": "File",
24
+ "File_Path": "../../log/log.txt",
25
+ "Roll_Period": "daily",
26
+ "Roll_Size": "1048576"
27
+ }
28
+ ]
29
+ }
30
+ ]
31
+ }
32
+ }
@@ -0,0 +1,37 @@
1
+ require_relative 'log_factory_manager'
2
+ require_relative 'log_factory_repository'
3
+
4
+ controller_name = 'test_controller'
5
+ userID = 5
6
+
7
+ # create log manager instance
8
+ # this could be a global variable declared in application level
9
+ log_manager = RTALogger::LogFactory.log_manager_instance
10
+
11
+ # set log manage application name (hard code)
12
+ log_manager.app_name = 'myTestApp'
13
+
14
+ # load log manager configuration from a json config file
15
+ log_manager.config_use_json_file('rta_logger_config.json')
16
+
17
+ # add log repository to log manager
18
+ #log_manager.propagator.add_log_repository(RTALogger::LogFactory.new_log_repository_console)
19
+
20
+ # add new topic to log manager
21
+ # use this api to get a new log topic instance
22
+ # this api could be called in entry point of each service or class initialize method
23
+ topic = log_manager.add_topic(controller_name)
24
+
25
+ # add log information to log topic
26
+ topic.debug(userID, 'Controller Name=', controller_name, 'debug')
27
+ topic.info(userID, 'Controller Name=', controller_name, 'information')
28
+ topic.warning(userID, 'Controller Name=', controller_name, 'warning')
29
+ topic.error(userID, 'Controller Name=', controller_name, 'error')
30
+ topic.fatal(userID, 'Controller Name=', controller_name, 'fatal')
31
+ topic.unknown(userID, 'Controller Name=', controller_name, 'unknown')
32
+
33
+ # update specific topic log level if necessary
34
+ # log_manager.update_topic_level(controller_name, RTALogger::LogSeverity::INFO)
35
+
36
+ # update all topics log level if necessary
37
+ # log_manager.update_all_topics_log_level(RTALogger::LogSeverity::INFO)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: RTALogger
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Babak Bahreini, RTA Backend Team
@@ -30,6 +30,20 @@ dependencies:
30
30
  - - ">="
31
31
  - !ruby/object:Gem::Version
32
32
  version: 1.11.4
33
+ - !ruby/object:Gem::Dependency
34
+ name: jbuilder
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '2.10'
40
+ type: :runtime
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '2.10'
33
47
  description: RTA Log Manager has been designed and implemented to provide standard
34
48
  logging API for developers.This prevents chaos in log data format. Also provide
35
49
  multiple extendable log repositories including wrapping existing loggers, like 'Fluentd'
@@ -42,6 +56,12 @@ extensions: []
42
56
  extra_rdoc_files: []
43
57
  files:
44
58
  - ".gitignore"
59
+ - ".idea/.gitignore"
60
+ - ".idea/.rakeTasks"
61
+ - ".idea/RTALogger.iml"
62
+ - ".idea/misc.xml"
63
+ - ".idea/modules.xml"
64
+ - ".idea/vcs.xml"
45
65
  - ".rspec"
46
66
  - ".travis.yml"
47
67
  - Gemfile
@@ -54,13 +74,13 @@ files:
54
74
  - bin/setup
55
75
  - lib/RTALogger.rb
56
76
  - lib/RTALogger/version.rb
57
- - lib/factory/origin/log_factory_file_logger.rb
58
- - lib/factory/origin/log_factory_log_formatter.rb
59
- - lib/factory/origin/log_factory_manager.rb
60
- - lib/factory/origin/log_factory_propagator.rb
61
- - lib/factory/origin/log_factory_record.rb
62
- - lib/factory/origin/log_factory_repository.rb
63
- - lib/factory/origin/log_factory_topic.rb
77
+ - lib/log_factory_file_logger.rb
78
+ - lib/log_factory_log_formatter.rb
79
+ - lib/log_factory_manager.rb
80
+ - lib/log_factory_propagator.rb
81
+ - lib/log_factory_record.rb
82
+ - lib/log_factory_repository.rb
83
+ - lib/log_factory_topic.rb
64
84
  - lib/log_formatter.rb
65
85
  - lib/log_formatter_json.rb
66
86
  - lib/log_formatter_text.rb
@@ -72,9 +92,9 @@ files:
72
92
  - lib/log_repository_file.rb
73
93
  - lib/log_repository_udp.rb
74
94
  - lib/log_severity.rb
75
- - lib/log_test.rb
76
- - lib/log_test_db.rb
77
95
  - lib/log_topic.rb
96
+ - lib/rta_logger_config.json
97
+ - lib/sample.rb
78
98
  homepage: https://github.com/BBahrainy/RTALogger.git
79
99
  licenses:
80
100
  - MIT
@@ -1,11 +0,0 @@
1
- require_relative '../../log_formatter_text'
2
- require_relative '../../log_formatter_json'
3
-
4
- module RTALogger
5
- module LogFactory
6
- def self.log_formatter_default
7
- # RTALogger::LogFormatterJSON.new
8
- RTALogger::LogFormatterText.new
9
- end
10
- end
11
- end
@@ -1,41 +0,0 @@
1
- #require 'logger'
2
- #require 'date'
3
- require_relative 'factory/origin/log_factory_manager'
4
- require_relative 'factory/origin/log_factory_repository'
5
- require 'socket'
6
-
7
- controller_name = 'test_controller'
8
- userID = 5
9
-
10
- log_manager = RTALogger::LogFactory.log_manager_instance
11
- log_manager.app_name = 'myTestApp'
12
- log_manager.config('../../../config/rta_logger_config.json')
13
- #log_manager.propagator.add_log_repository(RTALogger::LogFactory.new_log_repository_console)
14
- #log_manager.propagator.add_log_repository(RTALogger::LogFactory.new_log_repository_file('../../../log/log.txt'))
15
- #log_manager.propagator.add_log_repository(RTALogger::LogFactory.new_log_repository_udp('127.0.0.1', 4913))
16
- # log_manager.propagator.add_log_repository(RTALogger::LogFactory.new_log_repository_db)
17
-
18
- topic = log_manager.add_topic(controller_name)
19
-
20
- topic.info(userID, 'Controller Name=', controller_name, 'Called by client 1')
21
-
22
- #logger.level = RTALogger::LogSeverity::INFO
23
- #manager.update_topic_level(controller_name, RTALogger::LogSeverity::INFO)
24
-
25
- log_manager.update_all_topics_log_level(RTALogger::LogSeverity::INFO)
26
-
27
- topic.info(userID, 'Controller Name|', controller_name, 'Called by client |2|')
28
- topic.error(userID, 'Controller Name=', controller_name, 'Called by client 3')
29
-
30
- #sleep(10)
31
-
32
- topic.info(userID, 'Controller Name=', controller_name, 'Called by client |4|')
33
- topic.fatal(userID, 'Controller Name=', controller_name, 'Called by client 5')
34
- topic.info(userID, 'Controller Name=', controller_name, 'Called by client 6')
35
-
36
- #ruby_logger = Logger.new(STDOUT)
37
- #ruby_logger.formatter = proc do |severity, datetime, progname, msg|
38
- # "NICE: #{msg}\n"
39
- #end
40
- #ruby_logger.info('logged by ruby default logger')
41
-
@@ -1,59 +0,0 @@
1
- #require 'active_record'
2
- #require 'pg'
3
- # require 'active_record' # uncomment for not Rails environment
4
-
5
- #ActiveRecord::Base.establish_connection(:adapter => "postgresql",
6
- # :username => "postgre",
7
- # :database => "rails_test_development")
8
-
9
- require 'log_record'
10
-
11
- module RTALogger
12
- class LogFormatter
13
- def initialize(log_record,
14
- delimiter = '|',
15
- time_format = '%Y-%m-%d %H:%M:%S.%3N')
16
- @log_record = log_record
17
- @delimiter = delimiter
18
- @time_format = time_format
19
- @format_chance = format_chance
20
- end
21
-
22
- attr_accessor :log_record
23
- attr_accessor :delimiter
24
- attr_accessor :time_format
25
-
26
- def self.default_formatter(log_record)
27
- LogFormatter.new(log_record)
28
- end
29
-
30
- def to_s
31
- result = "#{occurred_at}#{@delimiter}#{@log_record.app_name}#{@delimiter}"
32
- result << "#{@log_record.topic_title}#{@delimiter}#{@log_record.context_id}"
33
- result << "#{@delimiter}#{@log_record.severity}#{@delimiter}#{log_message}"
34
-
35
- if @format_chance
36
- result unless @format_chance.call(occurred_at,
37
- @log_record.app_name,
38
- @log_record.topic_title,
39
- @log_record.context_id,
40
- @log_record.severity,
41
- log_message)
42
- end
43
- else
44
- result
45
- end
46
- end
47
-
48
- protected
49
-
50
- def log_message
51
- @log_record.message.join.gsub(delimiter, '&dlm&')
52
- end
53
-
54
- def occurred_at
55
- @log_record.occurred_at.strftime(time_format)
56
- end
57
- end
58
- end
59
-