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.
@@ -27,6 +27,6 @@ Gem::Specification.new do |spec|
27
27
  spec.bindir = "exe"
28
28
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
29
29
  spec.require_paths = ["lib"]
30
- spec.add_dependency "fluentd", "~> 1.11", ">= 1.11.4"
30
+ spec.add_dependency "fluent-logger", "~> 0.9"
31
31
  spec.add_dependency "jbuilder", "~> 2.10"
32
32
  end
@@ -1,3 +1,3 @@
1
1
  module RTALogger
2
- VERSION = '0.1.1'.freeze
2
+ VERSION = '1.1.0'.freeze
3
3
  end
@@ -1,12 +1,36 @@
1
- require_relative 'log_formatter_text'
2
- require_relative 'log_formatter_json'
1
+ require_relative 'log_formatter_base'
3
2
 
4
3
  module RTALogger
5
4
  # Log factory to get new instance of log formatter
6
5
  module LogFactory
7
6
  def self.log_formatter_default
8
- RTALogger::LogFormatterJSON.new
9
- # RTALogger::LogFormatterText.new
7
+ create_formatter(:json)
10
8
  end
9
+
10
+ def self.create_formatter(type, config_json = '')
11
+ lib_file = @log_formatters[type.to_sym]
12
+ raise "unregistered formatter class: #{type.to_s}" if lib_file.nil? || lib_file.empty?
13
+ begin
14
+ load lib_file
15
+ rescue
16
+ raise "unable to load formatter class file: #{lib_file}"
17
+ end
18
+
19
+ formatter_class_name = 'RTALogger::' + ('log_formatter_' + type.to_s).split('_').map(&:capitalize).join
20
+ formatter_class = Object.const_get(formatter_class_name)
21
+ return nil unless formatter_class
22
+ result = formatter_class.new
23
+
24
+ return result if config_json.empty?
25
+ result.load_config(config_json) if result.present?
26
+ return result
27
+ end
28
+
29
+ def self.register_log_formatter(type, class_file_name)
30
+ @log_formatters[type.to_sym] = class_file_name
31
+ end
32
+
33
+ @log_formatters = {:text => 'log_formatter_text.rb',
34
+ :json => 'log_formatter_json.rb'}
11
35
  end
12
36
  end
@@ -1,43 +1,37 @@
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
-
7
3
  module RTALogger
8
4
  # this module generates object instance
9
5
  module LogFactory
10
- def self.new_log_repository_console
11
- LogRepositoryConsole.new
12
- end
6
+ def self.create_repository(type, config_json = '')
7
+ lib_file = @log_repositories[type.to_sym]
8
+ raise "unregistered repository class: #{type.to_s}" if lib_file.nil? || lib_file.empty?
13
9
 
14
- def self.new_log_repository_file(file_path = 'log.txt', period = 'daily', shift_size = 1_048_576)
15
- LogRepositoryFile.new(file_path, period, shift_size)
16
- end
10
+ begin
11
+ load lib_file
12
+ rescue
13
+ raise "unable to load repository class file: #{lib_file}"
14
+ end
17
15
 
18
- def self.load_log_repository_file(config_json)
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
- ::RTALogger::LogFactory.new_log_repository_file(file_path, period, shift_size)
23
- end
16
+ # repo_class_name = 'RTALogger::' + type.split('_').map(&:capitalize).join
17
+ repo_class_name = 'RTALogger::' + ('log_repository_' + type.to_s).split('_').map(&:capitalize).join
18
+ repo_class = Object.const_get(repo_class_name)
19
+ return nil unless repo_class
20
+ result = repo_class.new
24
21
 
25
- def self.new_log_repository_udp(host = '127.0.0.1', port = 4913)
26
- LogRepositoryUDP.new(host, port)
22
+ # result = LogRepository.create type.to_sym
23
+ return result if config_json.empty?
24
+ result.load_config(config_json) if result.present?
25
+ return result
27
26
  end
28
27
 
29
- def self.load_log_repository_udp(config_json)
30
- host = config_json['Host'].to_s
31
- port = config_json['Port'].nil? ? 4913 : config_json['Port'].to_i
32
- ::RTALogger::LogFactory.new_log_repository_udp(host, port)
28
+ def self.register_log_repository(type, class_file_name)
29
+ @log_repositories[type.to_sym] = class_file_name
33
30
  end
34
31
 
35
- def self.create_repository(type, config_json)
36
- result = nil
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?
40
- result
41
- end
32
+ @log_repositories = {:console => 'log_repository_console.rb',
33
+ :file => 'log_repository_file.rb',
34
+ :udp => 'log_repository_upd.rb',
35
+ :fluentd => 'log_repository_fluentd.rb'}
42
36
  end
43
37
  end
@@ -5,8 +5,8 @@ require_relative 'log_topic'
5
5
  module RTALogger
6
6
  # this module generates object instance
7
7
  module LogFactory
8
- def self.new_log_topic(log_manager, topic_title, level = WARN)
9
- LogTopic.new(log_manager, topic_title, level)
8
+ def self.new_log_topic(log_manager, title, level = WARN, enable = true)
9
+ LogTopic.new(log_manager, title, level, enable)
10
10
  end
11
11
  end
12
12
  end
@@ -0,0 +1,33 @@
1
+ require 'jbuilder'
2
+ require_relative 'string'
3
+
4
+ module RTALogger
5
+ class LogFormatterBase
6
+ def initialize
7
+ @delimiter = '|'
8
+ end
9
+
10
+ attr_accessor :delimiter
11
+
12
+ def load_config(config_json)
13
+ @delimiter = config_json['delimiter'].nil? ? true : config_json['delimiter']
14
+ end
15
+
16
+ def format(log_record)
17
+ log_record.to_s
18
+ end
19
+
20
+ def to_builder
21
+ jb = Jbuilder.new do |json|
22
+ json.type self.class.to_s.split('::').last.underscore.sub('log_formatter_', '')
23
+ json.delimiter delimiter
24
+ end
25
+
26
+ jb
27
+ end
28
+
29
+ def reveal_config
30
+ to_builder.target!
31
+ end
32
+ end
33
+ end
@@ -1,10 +1,10 @@
1
1
  require 'jbuilder'
2
- require_relative 'log_formatter'
2
+ require_relative 'log_formatter_base'
3
3
 
4
4
  module RTALogger
5
5
  # json formatter which receive log_record and
6
6
  # returns it's data as json string
7
- class LogFormatterJSON
7
+ class LogFormatterJson < LogFormatterBase
8
8
  def format(log_record)
9
9
  return '' unless log_record
10
10
 
@@ -1,18 +1,18 @@
1
- require_relative 'log_formatter'
1
+ require_relative 'log_formatter_base'
2
2
 
3
3
  module RTALogger
4
4
  # text formatter which receive log_record and
5
5
  # returns it's data as delimited text string
6
- class LogFormatterText < LogFormatter
7
- def format(log_record, delimiter = '|')
6
+ class LogFormatterText < LogFormatterBase
7
+ def format(log_record)
8
8
  return '' unless log_record
9
9
 
10
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, '$<$')
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, '$<$')
16
16
 
17
17
  result
18
18
  end
@@ -1,28 +1,34 @@
1
1
  require 'date'
2
2
  require 'thread'
3
3
  require 'singleton'
4
+ require 'json'
5
+ require 'json/version'
6
+ require 'json/generic_object'
4
7
  require_relative 'log_factory_propagator'
5
8
  require_relative 'log_factory_repository'
6
9
  require_relative 'log_factory_topic'
7
- require_relative 'log_severity'
10
+ require_relative 'severity_level'
11
+ require 'jbuilder'
8
12
 
9
13
  # the module will contain all logger requirements
10
14
  module RTALogger
11
15
  # the class is the main class
12
16
  class LogManager
13
17
  include Singleton
14
- include LogSeverity
18
+ include SeverityLevel
15
19
  include RTALogger::LogFactory
16
20
 
17
21
  def initialize
18
22
  @enable = true
19
- @app_name = ENV.fetch('RTALogger_App_Name', 'unknownApp')
20
- @default_log_level = ENV.fetch('RTALogger_Log_Severity', ::RTALogger::LogSeverity::WARN)
23
+ @name = 'default_log_manager'
24
+ @app_name = ENV.fetch('RTA_LOGGER_APP_NAME', 'unknown_app')
25
+ @severity_level = ENV.fetch('RTA_LOGGER_SEVERITY_LEVEL', WARN)
26
+ @config_file_name = ''
21
27
  @topic_semaphore = Mutex.new
22
28
  @log_semaphore = Mutex.new
23
- @buffer_size = ENV.fetch('RTALogger_Buffer_Size', 100)
29
+ @buffer_size = ENV.fetch('RTA_LOGGER_BUFFER_SIZE', 100)
24
30
  @flush_size = @buffer_size * 20 / 100
25
- @flush_wait_time = ENV.fetch('RTALogger_Flush_Wait_Seconds', 15)
31
+ @flush_wait_time = ENV.fetch('RTA_LOGGER_FLUSH_WAIT_SECONDS', 15)
26
32
  @topics = {}
27
33
  @log_records = []
28
34
  @propagator = LogFactory.new_log_propagator
@@ -36,36 +42,40 @@ module RTALogger
36
42
  @flush_scheduler.run
37
43
  end
38
44
 
39
- def config_use_json_file(config_file_name)
40
- config_json = load_config_from_json_file(config_file_name)
45
+ attr_reader :name
46
+ attr_accessor :enable
47
+ attr_accessor :app_name
48
+ attr_reader :propagator
49
+ attr_accessor :default_severity_level
50
+ attr_accessor :buffer_size
51
+ attr_reader :flush_size
52
+ attr_accessor :flush_wait_time
53
+ attr_reader :topics
54
+ attr_reader :config_file_name
55
+
56
+ def config_use_json_file(file_name, manager_name = '')
57
+ config_json = load_config_from_json_file(file_name, manager_name)
58
+ @config_file_name = file_name if config_json
41
59
  apply_config(config_json)
42
60
  rescue StandardError => e
43
- puts e.message
44
61
  @propagator.drop_all_repositories
45
- @propagator.add_log_repository(LogFactory.new_log_repository_console)
62
+ @propagator.add_log_repository(LogFactory.create_repository(:console))
46
63
  end
47
64
 
48
- def config_use_json_string(config_string)
49
- config_json = load_config_from_json_string(config_file_name)
65
+ def config_use_json_string(config_string, manager_name = '')
66
+ config_json = load_config_from_json_string(config_string, manager_name)
50
67
  apply_config(config_json)
51
68
  rescue StandardError => e
52
- puts e.message
53
69
  @propagator.drop_all_repositories
54
- @propagator.add_log_repository(LogFactory.new_log_repository_console)
70
+ @propagator.add_log_repository(LogFactory.create_repository(:console))
55
71
  end
56
72
 
57
- attr_accessor :enable
58
- attr_accessor :app_name
59
- attr_reader :propagator
60
- attr_reader :default_log_level
61
-
62
- def add_topic(topic_title, log_level = @default_log_level)
73
+ def add_topic(title, severity_level = @default_severity_level, enable = true)
63
74
  @topic_semaphore.synchronize {
64
- @topics[topic_title.to_sym] ||= LogFactory.new_log_topic(self, topic_title, log_level)
75
+ @topics[title.to_sym] ||= LogFactory.new_log_topic(self, title, severity_level, enable)
65
76
  }
66
77
 
67
- @topics[topic_title.to_sym].enable = @enable
68
- @topics[topic_title.to_sym]
78
+ @topics[title.to_sym]
69
79
  end
70
80
 
71
81
  def add_log(log_record)
@@ -74,52 +84,103 @@ module RTALogger
74
84
  check_for_flush
75
85
  end
76
86
 
77
- def update_topic_log_level(topic, log_level = WARN)
78
- @topic_semaphore.synchronize { @topics[topic].log_level = log_level if @topics[topic] }
87
+ def update_topic_enable(topic, enable = true)
88
+ @topic_semaphore.synchronize { @topics[topic.to_sym].enable = enable if @topics[topic.to_sym] }
89
+ end
90
+
91
+ def update_all_topics_enable(enable = true)
92
+ @topic_semaphore.synchronize { @topics.keys.each { |topic| @topics[topic].enable = enable } }
93
+ end
94
+
95
+ def update_topic_severity_level(topic, severity_level = WARN)
96
+ @topic_semaphore.synchronize { @topics[topic.to_sym].severity_level = severity_level if @topics[topic.to_sym] }
97
+ end
98
+
99
+ def update_all_topics_severity_level(severity_level = WARN)
100
+ @topic_semaphore.synchronize { @topics.keys.each { |topic| @topics[topic].severity_level = severity_level } }
101
+ end
102
+
103
+ def to_builder
104
+ @topic_semaphore.synchronize do
105
+ jb = Jbuilder.new do |json|
106
+ json.name name
107
+ json.enable enable
108
+ json.app_name app_name
109
+ json.config_file_name config_file_name
110
+ json.default_severity_level default_severity_level
111
+ json.buffer_size buffer_size
112
+ json.flush_size flush_size
113
+ json.flush_wait_time flush_wait_time
114
+ json.repositories do
115
+ json.array! @propagator.repositories.collect { |repository| repository.to_builder.attributes! }
116
+ end
117
+ json.topics do
118
+ json.array! topics.keys.collect { |topic_key| @topics[topic_key].to_builder.attributes! }
119
+ end
120
+ end
121
+
122
+ jb
123
+ end
79
124
  end
80
125
 
81
- def update_all_topics_log_level(log_level = WARN)
82
- @topic_semaphore.synchronize { @topics.keys.each { |topic| @topics[topic].log_level = log_level } }
126
+ def reveal_config
127
+ to_builder.target!
83
128
  end
84
129
 
85
130
  private
86
131
 
87
- def load_config_from_json_file(config_file_name)
132
+ def load_config_from_json_file(config_file_name, manager_name = '')
88
133
  config_file = File.open config_file_name
89
- config_json = JSON.load config_file
90
- config_json = extract_config(config_json)
134
+ config_json = ::JSON.load(config_file)
135
+ config_json = extract_config(config_json, manager_name)
91
136
  config_json
92
137
  end
93
138
 
94
- def load_config_from_json_string(config_string)
95
- config_json = JSON.parse(config_string)
96
- config_json = extract_config(config_json)
139
+ def load_config_from_json_string(config_string, manager_name = '')
140
+ config_json = ::JSON.parse(config_string)
141
+ config_json = extract_config(config_json, manager_name)
97
142
  config_json
98
143
  end
99
144
 
100
- def extract_config(json_data)
101
- config_json = json_data['RTALogger']
145
+ def extract_config(json_data, manager_name = '')
146
+ config_json = json_data['rta_logger']
102
147
  raise 'RTALogger configuration not found!' unless config_json
103
- raise 'Log_Managers section does not exists json configuration' unless config_json['Log_Managers']
104
- raise 'No config manager defined in json configuration' unless config_json['Log_Managers'].count.positive?
105
- manager_name = config_json['Default_Manager']
148
+ raise 'Log_Managers section does not exists json configuration' unless config_json['log_managers']
149
+ raise 'No config manager defined in json configuration' unless config_json['log_managers'].count.positive?
150
+ manager_name = config_json['default_manager'] if manager_name.empty?
106
151
  unless manager_name.to_s.strip.empty?
107
- config_json = config_json['Log_Managers'].find { |item| item['Manager_Name'] == manager_name }
152
+ config_json = config_json['log_managers'].find { |item| item['manager_name'] == manager_name }
108
153
  end
109
- config_json ||= config_json['Log_Managers'][0]
154
+ config_json ||= config_json['log_managers'][0]
110
155
  raise 'Unable to extract RTA Log Manager configuration!' unless config_json
156
+ @name = manager_name if config_json
111
157
  config_json
112
158
  end
113
159
 
114
160
  def apply_config(config_json)
115
161
  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?
162
+ @enable = config_json['enable'].nil? ? true : config_json['enable']
163
+ @app_name = config_json['app_name'] unless config_json['app_name'].empty?
164
+ @default_severity_level = parse_severity_level_to_i(config_json['severity_level']) if config_json['severity_level']
165
+ @buffer_size = config_json['buffer_size'] if config_json['buffer_size']
166
+ @flush_wait_time = config_json['flush_wait_seconds'] if config_json['flush_wait_seconds']
121
167
  @propagator.drop_all_repositories
122
- config_json['Repos']&.each { |item| @propagator.load_log_repository(item) }
168
+ apply_config_repos(config_json)
169
+ apply_config_topics(config_json)
170
+ end
171
+
172
+ def apply_config_repos(config_json)
173
+ config_json['repositories']&.each { |item| @propagator.load_log_repository(item) }
174
+ end
175
+
176
+ def apply_config_topics(config_json)
177
+ config_json['topics']&.each do |topic|
178
+ next unless topic['title']
179
+ result_topic = add_topic(topic['title'])
180
+ next unless result_topic
181
+ result_topic.severity_level = parse_severity_level_to_i topic['severity_level'] if topic['severity_level']
182
+ result_topic.enable = topic['enable'] if topic['enable']
183
+ end
123
184
  end
124
185
 
125
186
  def initialize_flush_scheduler
@@ -153,7 +214,7 @@ module RTALogger
153
214
 
154
215
  def flush_all
155
216
  @log_semaphore.synchronize do
156
- @log_records[0...@log_records.count].each { |log| propagate(log) }
217
+ @log_records[0...@log_records.count].each { |log| propagate(log) }
157
218
  @log_records.clear
158
219
  end
159
220
  @propagator.propagate
@@ -162,5 +223,6 @@ module RTALogger
162
223
  def propagate(log_record)
163
224
  @propagator.add_log(log_record)
164
225
  end
226
+
165
227
  end
166
228
  end