RTALogger 0.1.1 → 1.1.0

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