RTALogger 0.1.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. checksums.yaml +4 -4
  2. data/.idea/.gitignore +2 -0
  3. data/.idea/.rakeTasks +7 -0
  4. data/.idea/RTALogger.iml +29 -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 +21 -23
  10. data/README.md +326 -4
  11. data/RTALogger.gemspec +2 -1
  12. data/lib/RTALogger.rb +2 -4
  13. data/lib/RTALogger/version.rb +1 -1
  14. data/lib/log_factory_log_formatter.rb +35 -0
  15. data/lib/{factory/origin/log_factory_manager.rb → log_factory_manager.rb} +1 -3
  16. data/lib/{factory/origin/log_factory_propagator.rb → log_factory_propagator.rb} +1 -2
  17. data/lib/{factory/origin/log_factory_record.rb → log_factory_record.rb} +1 -1
  18. data/lib/log_factory_repository.rb +37 -0
  19. data/lib/log_factory_topic.rb +12 -0
  20. data/lib/log_formatter.rb +11 -1
  21. data/lib/log_formatter_json.rb +4 -2
  22. data/lib/log_formatter_text.rb +8 -6
  23. data/lib/log_manager.rb +126 -40
  24. data/lib/log_propagator.rb +44 -45
  25. data/lib/log_record.rb +27 -28
  26. data/lib/log_repository.rb +26 -4
  27. data/lib/log_repository_console.rb +8 -3
  28. data/lib/log_repository_file.rb +24 -6
  29. data/lib/log_repository_fluent.rb +49 -0
  30. data/lib/log_repository_udp.rb +14 -7
  31. data/lib/log_topic.rb +26 -18
  32. data/lib/rta_logger_config.json +59 -0
  33. data/lib/sample.rb +48 -0
  34. data/lib/severity_level.rb +60 -0
  35. metadata +34 -20
  36. data/lib/factory/origin/log_factory_file_logger.rb +0 -16
  37. data/lib/factory/origin/log_factory_log_formatter.rb +0 -11
  38. data/lib/factory/origin/log_factory_repository.rb +0 -44
  39. data/lib/factory/origin/log_factory_topic.rb +0 -12
  40. data/lib/log_severity.rb +0 -17
  41. data/lib/log_test.rb +0 -41
  42. data/lib/log_test_db.rb +0 -59
@@ -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.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
@@ -9,6 +7,23 @@ module RTALogger
9
7
  @enable = true
10
8
  end
11
9
 
10
+ # @@sub_classes = {}
11
+
12
+ # def self.create type
13
+ # requested_class = @@sub_classes[type]
14
+ # if requested_class
15
+ # requested_class.new
16
+ # else
17
+ # raise "Bad log repository type: #{type}"
18
+ # end
19
+ # end
20
+ #
21
+ # def self.register repository_name
22
+ # @@sub_classes[repository_name] = self
23
+ # end
24
+
25
+ attr_accessor :enable
26
+
12
27
  def add_log_records(items)
13
28
  return 0 unless @enable
14
29
  @semaphore.synchronize do
@@ -17,7 +32,14 @@ module RTALogger
17
32
  flush_and_clear
18
33
  end
19
34
 
20
- attr_accessor :enable
35
+ def load_config(config_json)
36
+ @enable = config_json['enable'].nil? ? true : config_json['enable']
37
+
38
+ formatter_config = config_json['formatter']
39
+ if formatter_config && formatter_config['type']
40
+ @formatter = LogFactory.create_formatter(formatter_config['type'], formatter_config)
41
+ end
42
+ end
21
43
 
22
44
  protected
23
45
 
@@ -28,4 +50,4 @@ module RTALogger
28
50
  attr_reader :log_records
29
51
  attr_reader :semaphore
30
52
  end
31
- end
53
+ 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,9 +7,15 @@ 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
+ def load_config(config_json)
14
+ super
15
+ end
16
+
17
+ # register :console
18
+
13
19
  protected
14
20
 
15
21
  def flush_and_clear
@@ -18,6 +24,5 @@ module RTALogger
18
24
  end
19
25
  super
20
26
  end
21
-
22
27
  end
23
28
  end
@@ -1,25 +1,43 @@
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_log_formatter'
5
4
 
6
5
  module RTALogger
7
6
  # show log items on console out put
8
7
  class LogRepositoryFile < LogRepository
9
- def initialize(file_path = 'log.txt', period = 'daily', shift_size = 1048576)
8
+ def initialize(file_path = 'log.txt', period = 'daily', shift_size = 1_048_576)
10
9
  super()
11
- @file_logger = RTALogger::LogFactory.new_file_logger(file_path, period, shift_size)
12
- @formatter = RTALogger::LogFactory::log_formatter_default
10
+ @file_logger = create_ruby_logger(file_path, period, shift_size)
11
+ @formatter = RTALogger::LogFactory.log_formatter_default
13
12
  end
14
13
 
14
+ def load_config(config_json)
15
+ super
16
+
17
+ file_path = config_json['file_path'].to_s
18
+ period = config_json['roll_period'].to_s
19
+ shift_size = config_json['roll_size'].nil? ? 1_048_576 : config_json['roll_size'].to_i
20
+ @file_logger = create_ruby_logger(file_path, period, shift_size)
21
+ end
22
+
23
+ # register :file
24
+
15
25
  protected
16
26
 
27
+ def create_ruby_logger(file_path, period, shift_size)
28
+ ruby_logger = Logger.new(file_path, period, shift_size)
29
+ ruby_logger.level = Logger::Severity::DEBUG
30
+ ruby_logger.formatter = proc do |_severity, _datetime, _progname, msg|
31
+ "#{msg}\n"
32
+ end
33
+ ruby_logger
34
+ end
35
+
17
36
  def flush_and_clear
18
37
  semaphore.synchronize do
19
38
  @log_records.each { |log_record| @file_logger.debug(@formatter.format(log_record)) }
20
39
  end
21
40
  super
22
41
  end
23
-
24
42
  end
25
43
  end
@@ -0,0 +1,49 @@
1
+ require 'fluent-logger'
2
+ require_relative 'log_repository'
3
+
4
+ module RTALogger
5
+ class LogRepositoryFluent < LogRepository
6
+ def initialize(host = 'localhost', port = 24224, tls_options = nil)
7
+ super()
8
+ @formatter = RTALogger::LogFactory.log_formatter_json
9
+ @fluent_logger = create_fluentd_logger(host, port, tls_options)
10
+ end
11
+
12
+ def load_config(config_json)
13
+ super
14
+
15
+ host = config_json['host'].to_s
16
+ port = config_json['port'].to_s
17
+ tls_options = config_json['tls_options']
18
+
19
+ @fluent_logger = create_fluentd_logger(host, port, tls_options)
20
+ end
21
+
22
+ # register :fluentd
23
+
24
+ protected
25
+
26
+ def create_fluentd_logger(host, port, tls_options)
27
+ unless tls_options
28
+ fluent_logger = ::Fluent::Logger::FluentLogger.new(nil, :host => host, :port => port, :use_nonblock => true, :wait_writeable => false)
29
+ else
30
+ fluent_logger = ::Fluent::Logger::FluentLogger.new(nil, :host => host, :port => port, :tls_options => tls_options, :use_nonblock => true, :wait_writeable => false)
31
+ end
32
+
33
+ fluent_logger
34
+ end
35
+
36
+ def flush_and_clear
37
+ semaphore.synchronize do
38
+ @log_records.each do |log_record|
39
+ fluent_tag = log_record.app_name + '.' + log_record.topic_title
40
+ log_json_string = @formatter.format(log_record)
41
+ log_json = JSON.parse(log_json_string)
42
+
43
+ @fluent_logger.post(fluent_tag, log_json)
44
+ end
45
+ end
46
+ super
47
+ end
48
+ end
49
+ end
@@ -5,21 +5,28 @@ module RTALogger
5
5
  class LogRepositoryUDP < LogRepository
6
6
  def initialize(host = '127.0.0.1', port = 4913)
7
7
  super()
8
- @host = host
9
- @port = port
8
+ @udp_socket = UDPSocket.new
9
+ @udp_socket.bind(host, port)
10
10
  end
11
11
 
12
+ def load_config(config_json)
13
+ super
14
+
15
+ host = config_json['host'].to_s
16
+ port = config_json['port'].nil? ? 4913 : config_json['port'].to_i
17
+ @udp_socket = UDPSocket.new
18
+ @udp_socket.bind(host, port)
19
+ end
20
+
21
+ # register :udp
22
+
12
23
  protected
13
24
 
14
25
  def flush_and_clear
15
26
  semaphore.synchronize do
16
- u1 = UDPSocket.new
17
- u1.bind(@host, @port)
18
- @log_records.each { |log_record| u1.send log_record.to_s, 0, @host, @port}
19
- u1.close
27
+ @log_records.each { |log_record| @udp_socket.send @formatter.format(log_record), 0, @host, @port }
20
28
  end
21
29
  super
22
30
  end
23
-
24
31
  end
25
32
  end
@@ -1,51 +1,59 @@
1
- # topic
2
-
3
- require_relative './log_severity'
4
- require_relative 'factory/origin/log_factory_record'
1
+ require_relative 'severity_level'
2
+ require_relative 'log_factory_record'
3
+ require 'jbuilder'
5
4
 
6
5
  module RTALogger
7
- # the main class to logging data
6
+ # the main class to logging data as topic
8
7
  class LogTopic
9
- include LogSeverity
8
+ include SeverityLevel
10
9
  include RTALogger::LogFactory
11
10
 
12
- def initialize(log_manager, topic_title, log_level = WARN)
11
+ def initialize(log_manager, title, severity_level = WARN, enable = true)
13
12
  # Logger logger = Logger.new(Logger::DEBUG)
14
- @enable = true
13
+ @enable = enable
15
14
  @log_manager = log_manager
16
- @topic_title = topic_title.to_s.dup
17
- @log_level = log_level
15
+ @title = title.to_s.dup
16
+ @severity_level = severity_level
18
17
  end
19
18
 
20
19
  attr_accessor :enable
21
20
  attr_reader :log_manager
22
- attr_reader :topic_title
23
- attr_accessor :log_level
21
+ attr_reader :title
22
+ attr_accessor :severity_level
24
23
 
25
24
  def debug(context_id, *message)
26
- add(context_id, DEBUG, message) if @log_level.to_i <= DEBUG.to_i
25
+ add(context_id, DEBUG, message) if @severity_level.to_i <= DEBUG.to_i
27
26
  end
28
27
 
29
28
  def info(context_id, *message)
30
- add(context_id, INFO, message) if @log_level.to_i <= INFO.to_i
29
+ add(context_id, INFO, message) if @severity_level.to_i <= INFO.to_i
31
30
  end
32
31
 
33
32
  def warning(context_id, *message)
34
- add(context_id, WARN, message) if @log_level.to_i <= WARN.to_i
33
+ add(context_id, WARN, message) if @severity_level.to_i <= WARN.to_i
35
34
  end
36
35
 
37
36
  def error(context_id, *message)
38
- add(context_id, ERROR, message) if @log_level.to_i <= ERROR.to_i
37
+ add(context_id, ERROR, message) if @severity_level.to_i <= ERROR.to_i
39
38
  end
40
39
 
41
40
  def fatal(context_id, *message)
42
- add(context_id, FATAL, message) if @log_level.to_i <= FATAL.to_i
41
+ add(context_id, FATAL, message) if @severity_level.to_i <= FATAL.to_i
43
42
  end
44
43
 
45
44
  def unknown(context_id, *message)
46
- add(context_id, UNKNOWN, message) if @log_level.to_i <= UNKNOWN.to_i
45
+ add(context_id, UNKNOWN, message) if @severity_level.to_i <= UNKNOWN.to_i
47
46
  end
48
47
 
48
+ def to_builder
49
+ jb = Jbuilder.new do |json|
50
+ json.title title
51
+ json.severity_level parse_severity_level_to_s(severity_level)
52
+ json.enable enable
53
+ end
54
+
55
+ jb
56
+ end
49
57
  private
50
58
 
51
59
  def add(context_id, severity, *message)
@@ -0,0 +1,59 @@
1
+ {
2
+ "rta_logger":
3
+ {
4
+ "default_manager": "develop",
5
+ "log_managers":
6
+ [
7
+ {
8
+ "manager_name": "develop",
9
+ "enable": true,
10
+ "app_name": "TestApp",
11
+ "severity_level": "debug",
12
+ "buffer_size": 100,
13
+ "flush_wait_seconds": 15,
14
+ "repos":
15
+ [
16
+ {
17
+ "enable": true,
18
+ "type": "console",
19
+ "formatter":
20
+ {
21
+ "type": "text",
22
+ "delimiter": "|"
23
+ }
24
+ },
25
+ {
26
+ "enable": true,
27
+ "type": "file",
28
+ "file_path": "log.txt",
29
+ "roll_period": "daily",
30
+ "roll_size": "1048576",
31
+ "formatter":
32
+ {
33
+ "type": "text",
34
+ "delimiter": "|"
35
+ }
36
+ },
37
+ {
38
+ "enable": true,
39
+ "type": "fluentd",
40
+ "host": "localhost",
41
+ "port": "8888",
42
+ "formatter":
43
+ {
44
+ "type": "json"
45
+ }
46
+ }
47
+ ],
48
+ "topics":
49
+ [
50
+ {
51
+ "title": "test",
52
+ "enable": true,
53
+ "severity_level": "WARN"
54
+ }
55
+ ]
56
+ }
57
+ ]
58
+ }
59
+ }
@@ -0,0 +1,48 @@
1
+ require_relative 'log_factory_manager'
2
+ require_relative 'log_factory_repository'
3
+
4
+ controller_name = 'test_controller'
5
+ userID = 5
6
+
7
+
8
+ # RTALogger::LogFactory.register_log_repository :console, 'log_repository_console.rb'
9
+
10
+ # create log manager instance
11
+ # this could be a global variable declared in application level
12
+ log_manager = RTALogger::LogFactory.log_manager_instance
13
+
14
+ # set log manage application name (hard code)
15
+ log_manager.app_name = 'myTestApp'
16
+
17
+ # load log manager configuration from a json config file
18
+ log_manager.config_use_json_file('rta_logger_config.json')
19
+
20
+ # add log repository to log manager
21
+ #log_manager.propagator.add_log_repository(RTALogger::LogFactory.new_log_repository_console)
22
+
23
+ # add new topic to log manager
24
+ # use this api to get a new log topic instance
25
+ # this api could be called in entry point of each service or class initialize method
26
+ topic = log_manager.add_topic(controller_name)
27
+ test_topic = log_manager.add_topic('test')
28
+ # test_topic.severity_level = ::RTALogger::SeverityLevel::FATAL
29
+ # test_topic.enable = false
30
+
31
+ # add log information to log topic
32
+ topic.debug(userID, 'Controller Name=', controller_name, 'debug')
33
+ topic.info(userID, 'Controller Name=', controller_name, 'information')
34
+ topic.warning(userID, 'Controller Name=', controller_name, 'warning')
35
+ topic.error(userID, 'Controller Name=', controller_name, 'error')
36
+ topic.fatal(userID, 'Controller Name=', controller_name, 'fatal')
37
+ topic.unknown(userID, 'Controller Name=', controller_name, 'unknown')
38
+
39
+ test_topic.error(userID, 'test_topic', 'error')
40
+ test_topic.fatal(userID, 'test_topic', 'fatal')
41
+
42
+ puts log_manager.reveal_config
43
+
44
+ # update specific topic log level if necessary
45
+ # log_manager.update_topic_level(controller_name, RTALogger::SeverityLevel::INFO)
46
+
47
+ # update all topics log level if necessary
48
+ # log_manager.update_all_topics_severity_level(RTALogger::SeverityLevel::INFO)