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.
- checksums.yaml +4 -4
- data/.idea/RTALogger.iml +1 -8
- data/Gemfile.lock +4 -21
- data/README.md +317 -31
- data/RTALogger.gemspec +1 -1
- data/lib/RTALogger/version.rb +1 -1
- data/lib/log_factory_log_formatter.rb +28 -4
- data/lib/log_factory_repository.rb +23 -29
- data/lib/log_factory_topic.rb +2 -2
- data/lib/log_formatter_base.rb +33 -0
- data/lib/log_formatter_json.rb +2 -2
- data/lib/log_formatter_text.rb +8 -8
- data/lib/log_manager.rb +109 -47
- data/lib/log_propagator.rb +17 -15
- data/lib/log_record.rb +1 -1
- data/lib/log_repository.rb +43 -1
- data/lib/log_repository_console.rb +5 -1
- data/lib/log_repository_file.rb +33 -3
- data/lib/log_repository_fluentd.rb +58 -0
- data/lib/log_repository_udp.rb +14 -6
- data/lib/log_topic.rb +24 -14
- data/lib/rta_logger_config.json +45 -18
- data/lib/sample.rb +12 -2
- data/lib/severity_level.rb +60 -0
- data/lib/string.rb +9 -0
- metadata +9 -14
- data/lib/log_factory_file_logger.rb +0 -17
- data/lib/log_formatter.rb +0 -8
- data/lib/log_severity.rb +0 -17
data/RTALogger.gemspec
CHANGED
@@ -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 "
|
30
|
+
spec.add_dependency "fluent-logger", "~> 0.9"
|
31
31
|
spec.add_dependency "jbuilder", "~> 2.10"
|
32
32
|
end
|
data/lib/RTALogger/version.rb
CHANGED
@@ -1,12 +1,36 @@
|
|
1
|
-
require_relative '
|
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
|
-
|
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.
|
11
|
-
|
12
|
-
|
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
|
-
|
15
|
-
|
16
|
-
|
10
|
+
begin
|
11
|
+
load lib_file
|
12
|
+
rescue
|
13
|
+
raise "unable to load repository class file: #{lib_file}"
|
14
|
+
end
|
17
15
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
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
|
-
|
26
|
-
|
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.
|
30
|
-
|
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
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
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
|
data/lib/log_factory_topic.rb
CHANGED
@@ -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,
|
9
|
-
LogTopic.new(log_manager,
|
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
|
data/lib/log_formatter_json.rb
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
require 'jbuilder'
|
2
|
-
require_relative '
|
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
|
7
|
+
class LogFormatterJson < LogFormatterBase
|
8
8
|
def format(log_record)
|
9
9
|
return '' unless log_record
|
10
10
|
|
data/lib/log_formatter_text.rb
CHANGED
@@ -1,18 +1,18 @@
|
|
1
|
-
require_relative '
|
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 <
|
7
|
-
def format(log_record
|
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
|
data/lib/log_manager.rb
CHANGED
@@ -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 '
|
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
|
18
|
+
include SeverityLevel
|
15
19
|
include RTALogger::LogFactory
|
16
20
|
|
17
21
|
def initialize
|
18
22
|
@enable = true
|
19
|
-
@
|
20
|
-
@
|
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('
|
29
|
+
@buffer_size = ENV.fetch('RTA_LOGGER_BUFFER_SIZE', 100)
|
24
30
|
@flush_size = @buffer_size * 20 / 100
|
25
|
-
@flush_wait_time = ENV.fetch('
|
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
|
-
|
40
|
-
|
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.
|
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(
|
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.
|
70
|
+
@propagator.add_log_repository(LogFactory.create_repository(:console))
|
55
71
|
end
|
56
72
|
|
57
|
-
|
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[
|
75
|
+
@topics[title.to_sym] ||= LogFactory.new_log_topic(self, title, severity_level, enable)
|
65
76
|
}
|
66
77
|
|
67
|
-
@topics[
|
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
|
78
|
-
@topic_semaphore.synchronize { @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
|
82
|
-
|
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
|
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['
|
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['
|
104
|
-
raise 'No config manager defined in json configuration' unless config_json['
|
105
|
-
manager_name = config_json['
|
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['
|
152
|
+
config_json = config_json['log_managers'].find { |item| item['manager_name'] == manager_name }
|
108
153
|
end
|
109
|
-
config_json ||= config_json['
|
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['
|
117
|
-
@app_name = config_json['
|
118
|
-
@
|
119
|
-
@
|
120
|
-
@flush_wait_time = config_json['
|
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
|
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|
|
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
|