RTALogger 0.1.1 → 1.1.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.
@@ -5,39 +5,41 @@ module RTALogger
5
5
  class LogPropagator
6
6
  def initialize
7
7
  @semaphore = Mutex.new
8
- @log_records = []
9
- @log_repositories = []
8
+ @records = []
9
+ @repositories = []
10
10
  end
11
11
 
12
- def add_log(log_record)
13
- @semaphore.synchronize { @log_records.push(log_record.dup) }
12
+ attr_reader :repositories
13
+
14
+ def add_log(record)
15
+ @semaphore.synchronize { @records.push(record.dup) }
14
16
  end
15
17
 
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)
18
+ def add_log_repository(repository)
19
+ return unless repository.is_a? RTALogger::LogRepository
20
+ @repositories.push(repository) unless @repositories.include?(repository)
19
21
  end
20
22
 
21
23
  def load_log_repository(config_json)
22
- type = config_json['Type']
24
+ type = config_json['type']
23
25
  return if type.to_s.strip.empty?
24
- enable = config_json['Enable'].nil? ? true : config_json['Enable']
26
+ enable = config_json['enable'].nil? ? true : config_json['enable']
25
27
  return unless enable
26
28
 
27
- log_repository = ::RTALogger::LogFactory.create_repository(type, config_json)
28
- add_log_repository(log_repository)
29
+ repository = ::RTALogger::LogFactory.create_repository(type, config_json)
30
+ add_log_repository(repository)
29
31
  end
30
32
 
31
33
  def drop_all_repositories
32
- @semaphore.synchronize { @log_repositories.clear }
34
+ @semaphore.synchronize { @repositories.clear }
33
35
  end
34
36
 
35
37
  def propagate
36
38
  @semaphore.synchronize do
37
- @log_repositories.each do |log_repository|
38
- log_repository.add_log_records(@log_records)
39
+ @repositories.each do |repository|
40
+ repository.add_log_records(@records)
39
41
  end
40
- @log_records.clear
42
+ @records.clear
41
43
  end
42
44
  end
43
45
  end
@@ -21,7 +21,7 @@ module RTALogger
21
21
  end
22
22
 
23
23
  def topic_title
24
- @log_topic.topic_title
24
+ @log_topic.title
25
25
  end
26
26
  end
27
27
  end
@@ -1,3 +1,5 @@
1
+ require_relative 'string'
2
+
1
3
  module RTALogger
2
4
  # base log repository class
3
5
  class LogRepository
@@ -5,8 +7,27 @@ module RTALogger
5
7
  @semaphore = Mutex.new
6
8
  @log_records = []
7
9
  @enable = true
10
+ @formatter = RTALogger::LogFactory.log_formatter_default
8
11
  end
9
12
 
13
+ # @@sub_classes = {}
14
+
15
+ # def self.create type
16
+ # requested_class = @@sub_classes[type]
17
+ # if requested_class
18
+ # requested_class.new
19
+ # else
20
+ # raise "Bad log repository type: #{type}"
21
+ # end
22
+ # end
23
+ #
24
+ # def self.register repository_name
25
+ # @@sub_classes[repository_name] = self
26
+ # end
27
+
28
+ attr_accessor :enable
29
+ attr_accessor :formatter
30
+
10
31
  def add_log_records(items)
11
32
  return 0 unless @enable
12
33
  @semaphore.synchronize do
@@ -15,7 +36,28 @@ module RTALogger
15
36
  flush_and_clear
16
37
  end
17
38
 
18
- attr_accessor :enable
39
+ def load_config(config_json)
40
+ @enable = config_json['enable'].nil? ? true : config_json['enable']
41
+
42
+ formatter_config = config_json['formatter']
43
+ if formatter_config && formatter_config['type']
44
+ @formatter = LogFactory.create_formatter(formatter_config['type'], formatter_config)
45
+ end
46
+ end
47
+
48
+ def to_builder
49
+ jb = Jbuilder.new do |json|
50
+ json.type self.class.to_s.split('::').last.underscore.sub('log_repository_', '')
51
+ json.enable enable
52
+ json.formatter @formatter.to_builder.attributes!
53
+ end
54
+
55
+ jb
56
+ end
57
+
58
+ def reveal_config
59
+ to_builder.target!
60
+ end
19
61
 
20
62
  protected
21
63
 
@@ -6,10 +6,14 @@ module RTALogger
6
6
  class LogRepositoryConsole < LogRepository
7
7
  def initialize
8
8
  super
9
+ end
9
10
 
10
- @formatter = RTALogger::LogFactory.log_formatter_default
11
+ def load_config(config_json)
12
+ super
11
13
  end
12
14
 
15
+ # register :console
16
+
13
17
  protected
14
18
 
15
19
  def flush_and_clear
@@ -1,6 +1,5 @@
1
1
  require 'logger'
2
2
  require_relative 'log_repository'
3
- require_relative 'log_factory_file_logger'
4
3
  require_relative 'log_factory_log_formatter'
5
4
 
6
5
  module RTALogger
@@ -8,12 +7,43 @@ module RTALogger
8
7
  class LogRepositoryFile < LogRepository
9
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_path = file_path
11
+ @period = period
12
+ @shift_size = shift_size
13
+ @file_logger = create_ruby_logger(@file_path, @period, @shift_size)
13
14
  end
14
15
 
16
+ def load_config(config_json)
17
+ super
18
+
19
+ file_path = config_json['file_path'].to_s
20
+ period = config_json['roll_period'].to_s
21
+ shift_size = config_json['roll_size'].nil? ? 1_048_576 : config_json['roll_size'].to_i
22
+ @file_logger = create_ruby_logger(file_path, period, shift_size)
23
+ end
24
+
25
+ def to_builder
26
+ json = super
27
+ json.enable enable
28
+ json.file_path @file_path
29
+ json.period @period
30
+ json.shift_size @shift_size
31
+
32
+ json
33
+ end
34
+ # register :file
35
+
15
36
  protected
16
37
 
38
+ def create_ruby_logger(file_path, period, shift_size)
39
+ ruby_logger = Logger.new(file_path, period, shift_size)
40
+ ruby_logger.level = Logger::Severity::DEBUG
41
+ ruby_logger.formatter = proc do |_severity, _datetime, _progname, msg|
42
+ "#{msg}\n"
43
+ end
44
+ ruby_logger
45
+ end
46
+
17
47
  def flush_and_clear
18
48
  semaphore.synchronize do
19
49
  @log_records.each { |log_record| @file_logger.debug(@formatter.format(log_record)) }
@@ -0,0 +1,58 @@
1
+ require 'fluent-logger'
2
+ require_relative 'log_repository'
3
+
4
+ module RTALogger
5
+ class LogRepositoryFluentd < LogRepository
6
+ def initialize(host = 'localhost', port = 24224, tls_options = nil)
7
+ super()
8
+ @host = host
9
+ @port = port
10
+ @fluent_logger = create_fluentd_logger(host, port, tls_options)
11
+ end
12
+
13
+ def load_config(config_json)
14
+ super
15
+
16
+ host = config_json['host'].to_s
17
+ port = config_json['port'].to_s
18
+ tls_options = config_json['tls_options']
19
+
20
+ @fluent_logger = create_fluentd_logger(host, port, tls_options)
21
+ end
22
+
23
+ def to_builder
24
+ json = super
25
+ json.enable enable
26
+ json.host @host
27
+ json.port @port
28
+
29
+ json
30
+ end
31
+ # register :fluentd
32
+
33
+ protected
34
+
35
+ def create_fluentd_logger(host, port, tls_options)
36
+ unless tls_options
37
+ fluent_logger = ::Fluent::Logger::FluentLogger.new(nil, :host => host, :port => port, :use_nonblock => true, :wait_writeable => false)
38
+ else
39
+ fluent_logger = ::Fluent::Logger::FluentLogger.new(nil, :host => host, :port => port, :tls_options => tls_options, :use_nonblock => true, :wait_writeable => false)
40
+ end
41
+
42
+ fluent_logger
43
+ end
44
+
45
+ def flush_and_clear
46
+ semaphore.synchronize do
47
+ @log_records.each do |log_record|
48
+ fluent_tag = log_record.app_name + '.' + log_record.topic_title
49
+ log_json_string = @formatter.format(log_record)
50
+ log_json = JSON.parse(log_json_string)
51
+
52
+ @fluent_logger.post(fluent_tag, log_json)
53
+ end
54
+ end
55
+ super
56
+ end
57
+ end
58
+ end
@@ -5,18 +5,26 @@ 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
@@ -1,49 +1,59 @@
1
- require_relative 'log_severity'
1
+ require_relative 'severity_level'
2
2
  require_relative 'log_factory_record'
3
+ require 'jbuilder'
3
4
 
4
5
  module RTALogger
5
6
  # the main class to logging data as topic
6
7
  class LogTopic
7
- include LogSeverity
8
+ include SeverityLevel
8
9
  include RTALogger::LogFactory
9
10
 
10
- def initialize(log_manager, topic_title, log_level = WARN)
11
+ def initialize(log_manager, title, severity_level = WARN, enable = true)
11
12
  # Logger logger = Logger.new(Logger::DEBUG)
12
- @enable = true
13
+ @enable = enable
13
14
  @log_manager = log_manager
14
- @topic_title = topic_title.to_s.dup
15
- @log_level = log_level
15
+ @title = title.to_s.dup
16
+ @severity_level = severity_level
16
17
  end
17
18
 
18
19
  attr_accessor :enable
19
20
  attr_reader :log_manager
20
- attr_reader :topic_title
21
- attr_accessor :log_level
21
+ attr_reader :title
22
+ attr_accessor :severity_level
22
23
 
23
24
  def debug(context_id, *message)
24
- 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
25
26
  end
26
27
 
27
28
  def info(context_id, *message)
28
- 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
29
30
  end
30
31
 
31
32
  def warning(context_id, *message)
32
- 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
33
34
  end
34
35
 
35
36
  def error(context_id, *message)
36
- 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
37
38
  end
38
39
 
39
40
  def fatal(context_id, *message)
40
- 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
41
42
  end
42
43
 
43
44
  def unknown(context_id, *message)
44
- 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
45
46
  end
46
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
47
57
  private
48
58
 
49
59
  def add(context_id, severity, *message)
@@ -1,29 +1,56 @@
1
1
  {
2
- "RTALogger":
2
+ "rta_logger":
3
3
  {
4
- "Default_Manager": "Develop",
5
- "Log_Managers":
4
+ "default_manager": "develop",
5
+ "log_managers":
6
6
  [
7
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":
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
+ "repositories":
16
15
  [
17
16
  {
18
- "Enable": true,
19
- "Type": "Console"
17
+ "enable": true,
18
+ "type": "console",
19
+ "formatter":
20
+ {
21
+ "type": "text",
22
+ "delimiter": "|"
23
+ }
20
24
  },
21
25
  {
22
- "Enable": false,
23
- "Type": "File",
24
- "File_Path": "../../log/log.txt",
25
- "Roll_Period": "daily",
26
- "Roll_Size": "1048576"
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"
27
54
  }
28
55
  ]
29
56
  }
@@ -4,6 +4,8 @@ require_relative 'log_factory_repository'
4
4
  controller_name = 'test_controller'
5
5
  userID = 5
6
6
 
7
+ # RTALogger::LogFactory.register_log_repository :console, 'log_repository_console.rb'
8
+
7
9
  # create log manager instance
8
10
  # this could be a global variable declared in application level
9
11
  log_manager = RTALogger::LogFactory.log_manager_instance
@@ -21,6 +23,9 @@ log_manager.config_use_json_file('rta_logger_config.json')
21
23
  # use this api to get a new log topic instance
22
24
  # this api could be called in entry point of each service or class initialize method
23
25
  topic = log_manager.add_topic(controller_name)
26
+ test_topic = log_manager.add_topic('test')
27
+ # test_topic.severity_level = ::RTALogger::SeverityLevel::FATAL
28
+ # test_topic.enable = false
24
29
 
25
30
  # add log information to log topic
26
31
  topic.debug(userID, 'Controller Name=', controller_name, 'debug')
@@ -30,8 +35,13 @@ topic.error(userID, 'Controller Name=', controller_name, 'error')
30
35
  topic.fatal(userID, 'Controller Name=', controller_name, 'fatal')
31
36
  topic.unknown(userID, 'Controller Name=', controller_name, 'unknown')
32
37
 
38
+ test_topic.error(userID, 'test_topic', 'error')
39
+ test_topic.fatal(userID, 'test_topic', 'fatal')
40
+
41
+ puts log_manager.reveal_config
42
+
33
43
  # update specific topic log level if necessary
34
- # log_manager.update_topic_level(controller_name, RTALogger::LogSeverity::INFO)
44
+ # log_manager.update_topic_level(controller_name, RTALogger::SeverityLevel::INFO)
35
45
 
36
46
  # update all topics log level if necessary
37
- # log_manager.update_all_topics_log_level(RTALogger::LogSeverity::INFO)
47
+ # log_manager.update_all_topics_severity_level(RTALogger::SeverityLevel::INFO)