RTALogger 2.0.2 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f8fb5a3e4e0c67b6e485cf932ab274fc5a55539fb6432e76e119c0877d786c23
4
- data.tar.gz: 57c69c4601f00d24c395fd42b8a75fe74020a5f9b5222b14e38fe9c673134c97
3
+ metadata.gz: c31a37c1f8f9ce88c8fae11d7df9fe88d397e9e21da9c8b13ddce48fe5e216c5
4
+ data.tar.gz: 920e2000e9cf216dea8251dd6e6b5b2e3e2c114533e7459cd698eb2131c69c65
5
5
  SHA512:
6
- metadata.gz: 22b65c1867090cadd8aaff4f735ef401be30fe890e3164b7a45b5df40979ee0d5439d5c2fae66273c929e4c821abaa928b208b2e7c6ad535908be48b2923bea2
7
- data.tar.gz: 191367dfa21447a54f6ad218ed0f66d0615297b126e6a9aeda446c82900f05fbd457fbe0f200d860885be4f2760dd04a62e008634bc525c2e8554d5784883fc5
6
+ metadata.gz: 626deeb001694ef40e87743bb61742f1db0cbeeb46125f1f7b3185a52d33494d811439c3bc9d669c15e60563c9dc71d305159d3c801c06cdfcce82c4450970d0
7
+ data.tar.gz: 2a3a39efce340c0e0e204ebf6390d17283f6804b3846b3b086e849c25d92e9aec9994beb2a06ab6c81cf10a9abc8af0ded19d37317adbbe5abe16c1744a43aff
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- RTALogger (2.0.2)
4
+ RTALogger (2.1.0)
5
5
  fluent-logger (~> 0.9)
6
6
  jbuilder (~> 2.10)
7
7
 
data/README.md CHANGED
@@ -105,7 +105,22 @@ To use log manager APIs, first step is to have a quick review on Log Data Struct
105
105
  {
106
106
  "type": "text",
107
107
  "delimiter": "|"
108
- }
108
+ },
109
+ "filters":
110
+ [
111
+ {
112
+ "type": "topic",
113
+ "title": "topic_filter_1",
114
+ "enable": true,
115
+ "default_regex" : "^test$"
116
+ },
117
+ {
118
+ "type": "message",
119
+ "title": "message_filter_1",
120
+ "enable": false,
121
+ "default_regex" : "error"
122
+ }
123
+ ]
109
124
  },
110
125
  {
111
126
  "type": "file",
@@ -121,8 +136,8 @@ To use log manager APIs, first step is to have a quick review on Log Data Struct
121
136
  }
122
137
  },
123
138
  {
124
- "enable": true,
125
- "title": "console_repo_1",
139
+ "enable": false,
140
+ "title": "fluentd_repo_1",
126
141
  "type": "fluentd",
127
142
  "host": "localhost",
128
143
  "port": "8888",
@@ -202,7 +217,22 @@ the result will be:
202
217
  {
203
218
  "type": "text",
204
219
  "delimiter": "|"
205
- }
220
+ },
221
+ "filters":
222
+ [
223
+ {
224
+ "type": "topic",
225
+ "title": "topic_filter_1",
226
+ "enable": true,
227
+ "default_regex" : "^test$"
228
+ },
229
+ {
230
+ "type": "message",
231
+ "title": "message_filter_1",
232
+ "enable": false,
233
+ "default_regex" : "error"
234
+ }
235
+ ]
206
236
  },
207
237
  {
208
238
  "type": "file",
@@ -218,8 +248,8 @@ the result will be:
218
248
  }
219
249
  },
220
250
  {
221
- "enable": true,
222
- "title": "console_repo_1",
251
+ "enable": false,
252
+ "title": "fluentd_repo_1",
223
253
  "type": "fluentd",
224
254
  "host": "localhost",
225
255
  "port": "8888",
@@ -302,6 +332,22 @@ the result will be:
302
332
  - "type": ["text"/"json"] type of formatter
303
333
  - "delimiter": [any text delimiter you need.(as an instance pipe line "|")]
304
334
  if formatter not defined then the json formatter will be used
335
+ New Features:
336
+ * In RTALogger version 2.1.0 and above defineing filters is possible for each repository.
337
+ * Repositories filtes could restrict the amount of data stored by specific repository.
338
+ * Also you can add new repositories and filters at run time.
339
+ * filters configuration: It's possible to apply multiple filters on a repository. When repository will
340
+ flush a log_record only if the record pass all filter conditions.
341
+ * There are variaty of filter types, including:
342
+ 'topic' which apply a regular expresion on log_record.topic_title to pass filtering condition.
343
+ 'context' which apply a regular expresion on log_record.context_id to pass filtering condition.
344
+ 'message' which apply a regular expression on log_record.full_message to pass filtering condition.
345
+ * Each filter has following attributes to counfigure:
346
+ "type": ["topic"/"context"/"message" or any customized filter] described in previous lines.
347
+ "title": "filte_title" a unique title to make filter run time configuration
348
+ "enable": [true/false] this will enable or disable filtering opration of current filter.
349
+ "default_regex": "valid regual expression" to compare with corresponding attribute.
350
+ * It's possible to implement customize filter classes and integerate with RTALogger filter factory.
305
351
  - topics: This is an optional item. When you need to customize a specific topic severity level or
306
352
  enable value, you can define the settings here.
307
353
  - title: The topic title to customize. (mandatoy).
@@ -346,12 +392,14 @@ the result will be:
346
392
  # topic.enable
347
393
  # topic.severity_level
348
394
  # Other attributes could only change via config file via manager config_use_json_file
395
+ # In RTALogger version 2.1.0 and above, it is possible to add new repositories or repository filters at run time
396
+ # using log_manager.apply_run_time_config method.
349
397
  log_manager.apply_run_time_config(config_json)
350
398
  ```
351
399
  ### Implement and Expand
352
- #### Implement new log repository
400
+ #### Implement new customized log repository
353
401
  It is possible to implement new log repositories. There will be fue rules to implement and
354
- integrate new customized log repository with RTALogger LogManager.
402
+ integrate new customized log repository with RTALogger LogManager factory.
355
403
 
356
404
  1- Define you class inside RTALogger module.
357
405
 
@@ -396,6 +444,91 @@ module RTALogger
396
444
  end
397
445
  ```
398
446
 
447
+ #### Implement new customized log repository filter
448
+ It is possible to implement new log repository filter. There will be fue rules to implement and
449
+ integrate new customized log repository filter with RTALogger LogManager factory.
450
+
451
+ 1- Define you class inside RTALogger module.
452
+
453
+ 2- The class should be inherited from 'RTALogger::LogFilterBase'.
454
+
455
+ 3- Also appropriate naming convention is necessary.
456
+ As an example if you are implementing a Console Repo, your class name should be LogFilterTopic and
457
+ your source code should be placed in a ruby file and name it log_filter_topic.rb
458
+
459
+ 4- After implementing your own log filter, you should register the class at run-time using the following syntax:
460
+ ```ruby
461
+ RTALogger::LogFactory.register_log_filter :topic, 'log_filter_topic.rb'
462
+ ```
463
+ Another example: LogFilterMyCustomizedFilter
464
+
465
+ ```ruby
466
+ RTALogger::LogFactory.register_log_filter :my_customized_filter, 'log_repository_my_customized_filter.rb'
467
+ ```
468
+ Here is 'LogRepositoryTopic' implementation:
469
+ ```ruby
470
+ require_relative 'log_filter_base'
471
+
472
+ module RTALogger
473
+ class LogFilterTopic < LogFilterBase
474
+ def match_conditions(log_record)
475
+ return true if !@enable
476
+ result = super
477
+ return result unless result
478
+
479
+ return default_regex.present? ? (Regexp.new(@default_regex).match(log_record.topic_title)) : result
480
+ end
481
+ end
482
+ end
483
+ ```
484
+ #### Implement new customized log formatter
485
+
486
+ It is possible to implement new log formatter. There will be fue rules to implement and
487
+ integrate new customized log formatter with RTALogger LogManager factory.
488
+
489
+ 1- Define you class inside RTALogger module.
490
+
491
+ 2- The class should be inherited from 'RTALogger::LogFormatter'.
492
+
493
+ 3- Also appropriate naming convention is necessary.
494
+ As an example if you are implementing a Text formatter, your class name should be LogFormatterText and
495
+ your source code should be placed in a ruby file and name it log_formatter_text.rb
496
+
497
+ 4- After implementing your own log formatter, you should register the class at run-time using the following syntax:
498
+ ```ruby
499
+ RTALogger::LogFactory.register_log_formatter :text, 'log_formatter_text.rb'
500
+ ```
501
+ Another example: LogFormatterMyCustomizedFormatter
502
+
503
+ ```ruby
504
+ RTALogger::LogFactory.register_log_formatter :my_customized_formatter, 'log_formatter_my_customized_formatter.rb'
505
+ ```
506
+ Here is 'LogFormatterText' implementation:
507
+ ```ruby
508
+ require_relative 'log_formatter_base'
509
+ require_relative 'severity_level'
510
+
511
+ module RTALogger
512
+ # text formatter which receive log_record and
513
+ # returns it's data as delimited text string
514
+ class LogFormatterText < LogFormatterBase
515
+ include SeverityLevel
516
+
517
+ def format(log_record)
518
+ return '' unless log_record
519
+
520
+ result = log_record.occurred_at.strftime('%F %H:%M:%S:%3N')
521
+ result << @delimiter << log_record.app_name
522
+ result << @delimiter << log_record.topic_title
523
+ result << @delimiter << log_record.context_id.to_s
524
+ result << @delimiter << parse_severity_level_to_s(log_record.severity)
525
+ result << @delimiter << log_record.message.join(' ').gsub(delimiter, '$<$')
526
+
527
+ result
528
+ end
529
+ end
530
+ end
531
+ ```
399
532
  ## Contributing
400
533
 
401
534
  Bug reports and pull requests are welcome on GitHub at https://github.com/BBahrainy/RTALogger.
@@ -1,3 +1,3 @@
1
1
  module RTALogger
2
- VERSION = '2.0.2'.freeze
2
+ VERSION = '2.1.0'.freeze
3
3
  end
@@ -0,0 +1,33 @@
1
+ require_relative 'log_filter_base'
2
+
3
+ module RTALogger
4
+ # Log factory to get new instance of log filter
5
+ module LogFactory
6
+ def self.create_filter(type, config_json = '')
7
+ lib_file = @log_filters[type.to_sym]
8
+ raise "unregistered filter class: #{type.to_s}" if lib_file.nil? || lib_file.empty?
9
+ begin
10
+ load lib_file
11
+ rescue
12
+ raise "unable to load formatter class file: #{lib_file}"
13
+ end
14
+
15
+ filter_class_name = 'RTALogger::' + ('log_filter_' + type.to_s).split('_').map(&:capitalize).join
16
+ filter_class = Object.const_get(filter_class_name)
17
+ return nil unless filter_class
18
+ result = filter_class.new
19
+
20
+ return result if config_json.empty?
21
+ result.load_config(config_json) if result.present?
22
+ return result
23
+ end
24
+
25
+ def self.register_log_filter(type, class_file_name)
26
+ @log_filters[type.to_sym] = class_file_name
27
+ end
28
+
29
+ @log_filters = {:topic => 'log_filter_topic.rb',
30
+ :context => 'log_filter_context.rb',
31
+ :message => 'log_filter_message.rb'}
32
+ end
33
+ end
@@ -0,0 +1,39 @@
1
+ module RTALogger
2
+ class LogFilterBase
3
+ def initialize
4
+ @title = self.class.to_s.split('::').last.underscore
5
+ @enable = true
6
+ end
7
+
8
+ attr_accessor :title
9
+ attr_accessor :enable
10
+ attr_accessor :default_regex
11
+
12
+ def match_conditions(log_record)
13
+ return true if !@enable
14
+ return log_record.present?
15
+ end
16
+
17
+ def load_config(config_json)
18
+ @title = config_json['title'] if config_json['title'].present?
19
+ @enable = config_json['enable'].nil? ? true : config_json['enable'].present?
20
+ @default_regex = config_json['default_regex'] if config_json['default_regex'].present?
21
+ end
22
+
23
+ def apply_run_time_config(config_json)
24
+ @enable = config_json['enable'].nil? ? true : config_json['enable'].present?
25
+ @default_regex = config_json['default_regex'] if config_json['default_regex'].present?
26
+ end
27
+
28
+ def to_builder
29
+ jb = Jbuilder.new do |json|
30
+ json.type self.class.to_s.split('::').last.underscore.sub('log_filter_', '')
31
+ json.title @title
32
+ json.enable @enable
33
+ json.default_regex @default_regex
34
+ end
35
+
36
+ jb
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,13 @@
1
+ require_relative 'log_filter_base'
2
+
3
+ module RTALogger
4
+ class LogFilterContext < LogFilterBase
5
+ def match_conditions(log_record)
6
+ return true if !@enable
7
+ result = super
8
+ return result unless result
9
+
10
+ return default_regex.present? ? (Regexp.new(@default_regex).match(log_record.context_id.to_s)) : result
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ require_relative 'log_filter_base'
2
+
3
+ module RTALogger
4
+ class LogFilterMessage < LogFilterBase
5
+ def match_conditions(log_record)
6
+ return true if !@enable
7
+ result = super
8
+ return result unless result
9
+
10
+ return default_regex.present? ? (Regexp.new(@default_regex).match(log_record.full_message)) : result
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ require_relative 'log_filter_base'
2
+
3
+ module RTALogger
4
+ class LogFilterTopic < LogFilterBase
5
+ def match_conditions(log_record)
6
+ return true if !@enable
7
+ result = super
8
+ return result unless result
9
+
10
+ return default_regex.present? ? (Regexp.new(@default_regex).match(log_record.topic_title)) : result
11
+ end
12
+ end
13
+ end
@@ -76,7 +76,7 @@ module RTALogger
76
76
  @propagator.add_log_repository(LogFactory.create_repository(:console))
77
77
  end
78
78
 
79
- def config_use_json_string(config_string, title = '')
79
+ def config_use_json_string(config_string, title = '')
80
80
  config_json = load_config_from_json_string(config_string, title)
81
81
  apply_config(config_json)
82
82
  rescue StandardError => e
@@ -138,7 +138,8 @@ module RTALogger
138
138
  json.flush_size flush_size
139
139
  json.flush_wait_time flush_wait_time
140
140
  json.repositories do
141
- json.array! @propagator.repositories.collect { |repository| repository.to_builder.attributes! }
141
+ # json.array! @propagator.repositories.collect { |repository| repository.to_builder.attributes! }
142
+ json.array! @propagator.to_builder
142
143
  end
143
144
  json.topics do
144
145
  json.array! topics.keys.collect { |topic_key| @topics[topic_key].to_builder.attributes! }
@@ -156,22 +157,23 @@ module RTALogger
156
157
  def apply_run_time_config(config_json)
157
158
  return unless config_json
158
159
  @enable = config_json['enable'] unless config_json['enable'].nil?
159
- @default_severity_level = parse_severity_level_to_i(config_json['severity_level']) unless config_json['severity_level'].nil?
160
+ @default_severity_level = parse_severity_level_to_s(config_json['severity_level']) unless config_json['severity_level'].nil?
160
161
  self.buffer_size = config_json['buffer_size'] unless config_json['buffer_size'].nil?
161
162
  self.flush_wait_time = config_json['flush_wait_time'] unless config_json['flush_wait_time'].nil?
162
163
  @propagator.apply_run_time_config(config_json)
163
-
164
- if config_json['topics']
165
- config_json['topics'].each do |topic_config|
166
- next if topic_config['title'].nil?
167
- topic = topic_by_title(topic_config['title'])
168
- topic.apply_run_time_config(topic_config) if topic
169
- end
170
- end
164
+ apply_run_time_config_topics(config_json)
171
165
  end
172
166
 
173
167
  private
174
168
 
169
+ def apply_run_time_config_topics(config_json)
170
+ config_json['topics']&.each do |topic_config|
171
+ next if topic_config['title'].nil?
172
+ topic = topic_by_title(topic_config['title'])
173
+ topic.apply_run_time_config(topic_config) if topic.present?
174
+ end
175
+ end
176
+
175
177
  def load_config_from_json_file(config_file_name, title = '')
176
178
  config_file = File.open config_file_name
177
179
  config_json = ::JSON.load(config_file)
@@ -207,15 +209,10 @@ module RTALogger
207
209
  @default_severity_level = parse_severity_level_to_i(config_json['severity_level']) if config_json['severity_level']
208
210
  self.buffer_size = config_json['buffer_size'] if config_json['buffer_size']
209
211
  self.flush_wait_time = config_json['flush_wait_seconds'] if config_json['flush_wait_seconds']
210
- @propagator.drop_all_repositories
211
- apply_config_repos(config_json)
212
+ @propagator.load_repositories(config_json)
212
213
  apply_config_topics(config_json)
213
214
  end
214
215
 
215
- def apply_config_repos(config_json)
216
- config_json['repositories']&.each { |item| @propagator.load_log_repository(item) }
217
- end
218
-
219
216
  def apply_config_topics(config_json)
220
217
  config_json['topics']&.each do |topic|
221
218
  next unless topic['title']
@@ -6,7 +6,7 @@ module RTALogger
6
6
  def initialize
7
7
  @semaphore = Mutex.new
8
8
  @records = []
9
- @repositories = []
9
+ @repositories = {}
10
10
  end
11
11
 
12
12
  attr_reader :repositories
@@ -16,20 +16,34 @@ module RTALogger
16
16
  end
17
17
 
18
18
  def add_log_repository(repository)
19
+ return if repository.nil? || repository.title.to_s.empty?
19
20
  return unless repository.is_a? RTALogger::LogRepository
20
- @repositories.push(repository) unless @repositories.include?(repository)
21
+ @semaphore.synchronize { @repositories[repository.title.to_sym] = repository unless @repositories[repository.title.to_sym].present? }
21
22
  end
22
23
 
23
24
  def load_log_repository(config_json)
24
25
  type = config_json['type']
25
26
  return if type.to_s.strip.empty?
26
- enable = config_json['enable'].nil? ? true : config_json['enable']
27
- return unless enable
28
27
 
29
28
  repository = ::RTALogger::LogFactory.create_repository(type, config_json)
30
29
  add_log_repository(repository)
31
30
  end
32
31
 
32
+ def load_repositories(config_json)
33
+ return if config_json.nil?
34
+
35
+ @semaphore.synchronize do
36
+ @repositories.clear
37
+ config_json['repositories']&.each do |repository_config|
38
+ type = repository_config['type']
39
+ next if type.to_s.strip.empty?
40
+
41
+ repository = ::RTALogger::LogFactory.create_repository(type, repository_config)
42
+ @repositories[repository.title.to_sym] = repository unless @repositories[repository.title.to_sym].present?
43
+ end
44
+ end
45
+ end
46
+
33
47
  def drop_all_repositories
34
48
  @semaphore.synchronize { @repositories.clear }
35
49
  end
@@ -48,23 +62,41 @@ module RTALogger
48
62
 
49
63
  def apply_run_time_config(config_json)
50
64
  return unless config_json
65
+ apply_run_time_config_repositories(config_json)
66
+ end
51
67
 
52
- if config_json['repositories']
53
- config_json['repositories'].each do |repository_config|
54
- next if repository_config['title'].nil?
55
- repository = repository_by_title(repository_config['title'])
56
- repository.apply_run_time_config(repository_config) if repository
68
+ def propagate
69
+ @semaphore.synchronize do
70
+ @repositories.keys.each do |repository_key|
71
+ @repositories[repository_key.to_sym].add_log_records(@records)
57
72
  end
73
+ @records.clear
58
74
  end
59
75
  end
60
76
 
61
- def propagate
77
+ def to_builder
78
+ result = nil
62
79
  @semaphore.synchronize do
63
- @repositories.each do |repository|
64
- repository.add_log_records(@records)
80
+ result = @repositories&.keys.collect { |repository_key| @repositories[repository_key].to_builder.attributes! }
81
+ end
82
+
83
+ return result
84
+ end
85
+
86
+ private
87
+
88
+ def apply_run_time_config_repositories(config_json)
89
+ config_json['repositories']&.each do |repository_config|
90
+ next if repository_config['title'].nil?
91
+ repository = repository_by_title(repository_config['title'])
92
+ if repository.present?
93
+ repository.apply_run_time_config(repository_config)
94
+ else
95
+ repository = ::RTALogger::LogFactory.create_repository(repository_config['type'], config_json)
96
+ add_log_repository(repository)
65
97
  end
66
- @records.clear
67
98
  end
68
99
  end
100
+
69
101
  end
70
102
  end
@@ -16,6 +16,10 @@ module RTALogger
16
16
  attr_reader :message
17
17
  attr_reader :occurred_at
18
18
 
19
+ def full_message
20
+ message.join(' ')
21
+ end
22
+
19
23
  def app_name
20
24
  @log_topic.log_manager.app_name
21
25
  end
@@ -1,4 +1,5 @@
1
1
  require_relative 'string'
2
+ require_relative 'log_factory_filter'
2
3
 
3
4
  module RTALogger
4
5
  # base log repository class
@@ -9,6 +10,7 @@ module RTALogger
9
10
  @title = self.class.to_s.split('::').last.underscore
10
11
  @enable = true
11
12
  @formatter = RTALogger::LogFactory.log_formatter_default
13
+ @filters = {}
12
14
  end
13
15
 
14
16
  # @@sub_classes = {}
@@ -33,8 +35,11 @@ module RTALogger
33
35
  def add_log_records(items)
34
36
  return 0 unless @enable
35
37
  @semaphore.synchronize do
36
- items.each { |item| @log_records.push(item.dup) }
38
+ items.each do |item|
39
+ @log_records.push(item.dup) if filters_accept(item)
40
+ end
37
41
  end
42
+
38
43
  flush_and_clear
39
44
  end
40
45
 
@@ -45,6 +50,8 @@ module RTALogger
45
50
  if formatter_config && formatter_config['type']
46
51
  @formatter = LogFactory.create_formatter(formatter_config['type'], formatter_config)
47
52
  end
53
+
54
+ apply_config_filters(config_json)
48
55
  end
49
56
 
50
57
  def to_builder
@@ -52,6 +59,9 @@ module RTALogger
52
59
  json.type self.class.to_s.split('::').last.underscore.sub('log_repository_', '')
53
60
  json.enable enable
54
61
  json.formatter @formatter.to_builder.attributes!
62
+ json.filters do
63
+ json.array! @filters.keys.collect { |filter_key| @filters[filter_key].to_builder.attributes! }
64
+ end
55
65
  end
56
66
 
57
67
  jb
@@ -61,17 +71,63 @@ module RTALogger
61
71
  to_builder.target!
62
72
  end
63
73
 
74
+ def filter_by_title(title)
75
+ result = nil
76
+ @semaphore.synchronize do
77
+ @filters.keys.each do |filter_key|
78
+ result = @filters[filter_key.to_sym] if filter_key.to_s.casecmp(title).zero?
79
+ break if result
80
+ end
81
+ end
82
+
83
+ return result
84
+ end
85
+
64
86
  def apply_run_time_config(config_json)
65
87
  return unless config_json
66
88
  @enable = config_json['enable'] unless config_json['enable'].nil?
89
+ apply_run_time_config_filters(config_json)
67
90
  end
68
91
 
69
92
  protected
70
93
 
94
+ def apply_config_filters(config_json)
95
+ config_json['filters']&.each do |filter_config|
96
+ next if filter_config['type'].nil? || filter_config['title'].nil?
97
+ filter = LogFactory.create_filter(filter_config['type'], filter_config)
98
+ @filters[filter_config['title'].to_sym] = filter if filter.present?
99
+ end
100
+ end
101
+
102
+ def apply_run_time_config_filters(config_json)
103
+ return unless config_json
104
+
105
+ config_json['filters']&.each do |filter_config|
106
+ next if filter_config['title'].nil?
107
+ filter = filter_by_title(filter_config['title'])
108
+ if filter.present?
109
+ filter.apply_run_time_config(filter_config)
110
+ else
111
+ filter = LogFactory.create_filter(filter_config['type'], filter_config)
112
+ @semaphore.synchronize { @filters[filter_config['title'].to_sym] = filter if filter.present? }
113
+ end
114
+ end
115
+ end
116
+
71
117
  def flush_and_clear
72
118
  @semaphore.synchronize { @log_records.clear }
73
119
  end
74
120
 
121
+ def filters_accept(log_record)
122
+ result = true
123
+ @filters&.keys.each do |filter_key|
124
+ result = @filters[filter_key.to_sym]&.match_conditions(log_record)
125
+ break unless result
126
+ end
127
+
128
+ return result
129
+ end
130
+
75
131
  attr_reader :log_records
76
132
  attr_reader :semaphore
77
133
  end
@@ -17,7 +17,7 @@ module RTALogger
17
17
  protected
18
18
 
19
19
  def flush_and_clear
20
- semaphore.synchronize do
20
+ @semaphore.synchronize do
21
21
  @log_records.each { |log_record| puts @formatter.format(log_record) }
22
22
  end
23
23
  super
@@ -31,8 +31,13 @@ module RTALogger
31
31
 
32
32
  json
33
33
  end
34
+
34
35
  # register :file
35
36
 
37
+ def apply_run_time_config(config_json)
38
+ super config_json
39
+ end
40
+
36
41
  protected
37
42
 
38
43
  def create_ruby_logger(file_path, period, shift_size)
@@ -45,7 +50,7 @@ module RTALogger
45
50
  end
46
51
 
47
52
  def flush_and_clear
48
- semaphore.synchronize do
53
+ @semaphore.synchronize do
49
54
  @log_records.each { |log_record| @file_logger.debug(@formatter.format(log_record)) }
50
55
  end
51
56
  super
@@ -7,43 +7,85 @@ module RTALogger
7
7
  super()
8
8
  @host = host
9
9
  @port = port
10
- @fluent_logger = create_fluentd_logger(host, port, tls_options)
10
+ @tls_options = tls_options
11
+ @fluent_logger = nil
11
12
  end
12
13
 
13
14
  def load_config(config_json)
14
15
  super
15
16
 
16
- host = config_json['host'].to_s
17
- port = config_json['port'].to_s
18
- tls_options = config_json['tls_options']
17
+ @host = config_json['host'].to_s
18
+ @port = config_json['port'].to_i
19
+ @tls_options = config_json['tls_options']
19
20
 
20
- @fluent_logger = create_fluentd_logger(host, port, tls_options)
21
+ @semaphore.synchronize { @fluent_logger = nil }
22
+ end
23
+
24
+ def host=(host)
25
+ if @host != host
26
+ @host = host ? host : 'localhost'
27
+ @semaphore.synchronize { @fluent_logger = nil }
28
+ end
29
+ end
30
+
31
+ def host
32
+ @host
33
+ end
34
+
35
+ def port=(port)
36
+ if @port != port
37
+ @port = port ? port : 24224
38
+ @semaphore.synchronize { @fluent_logger = nil }
39
+ end
40
+ end
41
+
42
+ def port
43
+ @port
21
44
  end
22
45
 
23
46
  def to_builder
24
47
  json = super
25
- json.enable enable
48
+ json.enable @enable
26
49
  json.host @host
27
50
  json.port @port
51
+ json.tls_options @tls_options
28
52
 
29
53
  json
30
54
  end
55
+
31
56
  # register :fluentd
32
57
 
58
+ def apply_run_time_config(config_json)
59
+ super config_json
60
+
61
+ @host = config_json['host'] unless config_json['host'].nil?
62
+ @port = config_json['port'] unless config_json['port'].nil?
63
+ @tls_options = config_json['tls_options'] unless config_json['tls_options'].nil?
64
+ @semaphore.synchronize { @fluent_logger = nil }
65
+ end
66
+
33
67
  protected
34
68
 
35
69
  def create_fluentd_logger(host, port, tls_options)
70
+ return nil unless @enable
71
+
36
72
  unless tls_options
37
73
  fluent_logger = ::Fluent::Logger::FluentLogger.new(nil, :host => host, :port => port, :use_nonblock => true, :wait_writeable => false)
38
74
  else
39
- fluent_logger = ::Fluent::Logger::FluentLogger.new(nil, :host => host, :port => port, :tls_options => tls_options, :use_nonblock => true, :wait_writeable => false)
75
+ fluent_logger = ::Fluent::Logger::FluentLogger.new(nil, :host => host,
76
+ :port => port,
77
+ :tls_options => tls_options,
78
+ :use_nonblock => true,
79
+ :wait_writeable => false)
40
80
  end
41
81
 
42
82
  fluent_logger
43
83
  end
44
84
 
45
85
  def flush_and_clear
46
- semaphore.synchronize do
86
+ @semaphore.synchronize do
87
+ @fluent_logger = create_fluentd_logger(@host, @port, @tls_options) unless @fluent_logger.present?
88
+
47
89
  @log_records.each do |log_record|
48
90
  fluent_tag = log_record.app_name + '.' + log_record.topic_title
49
91
  log_json_string = @formatter.format(log_record)
@@ -52,6 +94,7 @@ module RTALogger
52
94
  @fluent_logger.post(fluent_tag, log_json)
53
95
  end
54
96
  end
97
+
55
98
  super
56
99
  end
57
100
  end
@@ -21,7 +21,22 @@
21
21
  {
22
22
  "type": "text",
23
23
  "delimiter": "|"
24
- }
24
+ },
25
+ "filters":
26
+ [
27
+ {
28
+ "type": "topic",
29
+ "title": "topic_filter_1",
30
+ "enable": true,
31
+ "default_regex" : "^test$"
32
+ },
33
+ {
34
+ "type": "message",
35
+ "title": "message_filter_1",
36
+ "enable": false,
37
+ "default_regex" : "error"
38
+ }
39
+ ]
25
40
  },
26
41
  {
27
42
  "type": "file",
@@ -37,8 +52,8 @@
37
52
  }
38
53
  },
39
54
  {
40
- "enable": true,
41
- "title": "console_repo_1",
55
+ "enable": false,
56
+ "title": "fluentd_repo_1",
42
57
  "type": "fluentd",
43
58
  "host": "localhost",
44
59
  "port": "8888",
@@ -39,7 +39,7 @@ topic.unknown(userID, 'Controller Name=', controller_name, 'unknown')
39
39
  test_topic.error(userID, 'test_topic', 'error')
40
40
  test_topic.fatal(userID, 'test_topic', 'fatal')
41
41
 
42
- puts log_manager.reveal_config
42
+ # puts log_manager.reveal_config
43
43
 
44
44
  # update specific topic log level if necessary
45
45
  # log_manager.update_topic_level(controller_name, RTALogger::SeverityLevel::INFO)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: RTALogger
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.2
4
+ version: 2.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Babak Bahreini, RTA Backend Team
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-12-27 00:00:00.000000000 Z
11
+ date: 2020-12-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: fluent-logger
@@ -68,12 +68,17 @@ files:
68
68
  - bin/setup
69
69
  - lib/RTALogger.rb
70
70
  - lib/RTALogger/version.rb
71
+ - lib/log_factory_filter.rb
71
72
  - lib/log_factory_log_formatter.rb
72
73
  - lib/log_factory_manager.rb
73
74
  - lib/log_factory_propagator.rb
74
75
  - lib/log_factory_record.rb
75
76
  - lib/log_factory_repository.rb
76
77
  - lib/log_factory_topic.rb
78
+ - lib/log_filter_base.rb
79
+ - lib/log_filter_context.rb
80
+ - lib/log_filter_message.rb
81
+ - lib/log_filter_topic.rb
77
82
  - lib/log_formatter_base.rb
78
83
  - lib/log_formatter_json.rb
79
84
  - lib/log_formatter_text.rb