RTALogger 0.1.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
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)