RTALogger 2.0.1 → 2.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/README.md +153 -15
- data/lib/RTALogger/version.rb +1 -1
- data/lib/log_factory_filter.rb +33 -0
- data/lib/log_filter_base.rb +39 -0
- data/lib/log_filter_context.rb +13 -0
- data/lib/log_filter_message.rb +13 -0
- data/lib/log_filter_topic.rb +13 -0
- data/lib/log_formatter_base.rb +42 -1
- data/lib/log_formatter_json.rb +16 -3
- data/lib/log_formatter_text.rb +1 -4
- data/lib/log_manager.rb +16 -19
- data/lib/log_propagator.rb +45 -13
- data/lib/log_record.rb +4 -0
- data/lib/log_repository.rb +62 -5
- data/lib/log_repository_console.rb +1 -1
- data/lib/log_repository_file.rb +8 -1
- data/lib/log_repository_fluentd.rb +53 -8
- data/lib/log_topic.rb +1 -1
- data/lib/rta_logger_config.json +21 -5
- data/lib/sample.rb +10 -1
- data/lib/string.rb +33 -2
- metadata +7 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6e3e0080b58239ca52e5c80dceab5dfacd7202d25dbef441695c8f3fef56ad70
|
4
|
+
data.tar.gz: 40f0c55f14e92a4207b932e6090c14db5b6177fbc10e0f5c642ceb65c2c5e2b3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 50e947dbcfbbda443696f07bc804b982a7310407580d429011f1932cdb304707eb303346445edb98c4cd0f140ca8ba46a4d84f5752f9017db4c64e9871b3886c
|
7
|
+
data.tar.gz: d9414ec73afcede5e67987fe83de43afc3ce5312db5b7089358bd4c1162004fbdaab2dbe48c02e8191d82a9a64bf2c69f5501ced9288aec49fee42bfc7f71b24
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -94,7 +94,7 @@ To use log manager APIs, first step is to have a quick review on Log Data Struct
|
|
94
94
|
"app_name": "TestApp",
|
95
95
|
"severity_level": "trace",
|
96
96
|
"buffer_size": 100,
|
97
|
-
"flush_wait_seconds":
|
97
|
+
"flush_wait_seconds": 5,
|
98
98
|
"repositories":
|
99
99
|
[
|
100
100
|
{
|
@@ -104,8 +104,24 @@ To use log manager APIs, first step is to have a quick review on Log Data Struct
|
|
104
104
|
"formatter":
|
105
105
|
{
|
106
106
|
"type": "text",
|
107
|
-
"delimiter": "|"
|
108
|
-
|
107
|
+
"delimiter": "|",
|
108
|
+
"colorize": true
|
109
|
+
},
|
110
|
+
"filters":
|
111
|
+
[
|
112
|
+
{
|
113
|
+
"type": "topic",
|
114
|
+
"title": "topic_filter_1",
|
115
|
+
"enable": true,
|
116
|
+
"default_regex" : "^test$"
|
117
|
+
},
|
118
|
+
{
|
119
|
+
"type": "message",
|
120
|
+
"title": "message_filter_1",
|
121
|
+
"enable": false,
|
122
|
+
"default_regex" : "error"
|
123
|
+
}
|
124
|
+
]
|
109
125
|
},
|
110
126
|
{
|
111
127
|
"type": "file",
|
@@ -121,8 +137,8 @@ To use log manager APIs, first step is to have a quick review on Log Data Struct
|
|
121
137
|
}
|
122
138
|
},
|
123
139
|
{
|
124
|
-
"enable":
|
125
|
-
"title": "
|
140
|
+
"enable": false,
|
141
|
+
"title": "fluentd_repo_1",
|
126
142
|
"type": "fluentd",
|
127
143
|
"host": "localhost",
|
128
144
|
"port": "8888",
|
@@ -191,7 +207,7 @@ the result will be:
|
|
191
207
|
"app_name": "TestApp",
|
192
208
|
"severity_level": "trace",
|
193
209
|
"buffer_size": 100,
|
194
|
-
"flush_wait_seconds":
|
210
|
+
"flush_wait_seconds": 5,
|
195
211
|
"repositories":
|
196
212
|
[
|
197
213
|
{
|
@@ -201,8 +217,24 @@ the result will be:
|
|
201
217
|
"formatter":
|
202
218
|
{
|
203
219
|
"type": "text",
|
204
|
-
"delimiter": "|"
|
205
|
-
|
220
|
+
"delimiter": "|",
|
221
|
+
"colorize": true
|
222
|
+
},
|
223
|
+
"filters":
|
224
|
+
[
|
225
|
+
{
|
226
|
+
"type": "topic",
|
227
|
+
"title": "topic_filter_1",
|
228
|
+
"enable": true,
|
229
|
+
"default_regex" : "^test$"
|
230
|
+
},
|
231
|
+
{
|
232
|
+
"type": "message",
|
233
|
+
"title": "message_filter_1",
|
234
|
+
"enable": false,
|
235
|
+
"default_regex" : "error"
|
236
|
+
}
|
237
|
+
]
|
206
238
|
},
|
207
239
|
{
|
208
240
|
"type": "file",
|
@@ -218,8 +250,8 @@ the result will be:
|
|
218
250
|
}
|
219
251
|
},
|
220
252
|
{
|
221
|
-
"enable":
|
222
|
-
"title": "
|
253
|
+
"enable": false,
|
254
|
+
"title": "fluentd_repo_1",
|
223
255
|
"type": "fluentd",
|
224
256
|
"host": "localhost",
|
225
257
|
"port": "8888",
|
@@ -261,7 +293,7 @@ the result will be:
|
|
261
293
|
- buffer_size: Minimune possible value for this attribute is 100 and defines memory buffer size (number of buffered log objects) to
|
262
294
|
decread api consumers wait time. when the buffer is full the flush operation will
|
263
295
|
save buffered logs to log repositoies.
|
264
|
-
- flush_wait_seconds: Minimum possible value for this attribure is
|
296
|
+
- flush_wait_seconds: Minimum possible value for this attribure is 5 seconds and defines time in soconds which log managers wait to flush buffered log records
|
265
297
|
to log repository.
|
266
298
|
- repositories: Array of log repositories. It is possible to define multiple log repositories to
|
267
299
|
store log data. there are variaty of log repositories and it is possible to
|
@@ -275,6 +307,8 @@ the result will be:
|
|
275
307
|
- "foramtter" is the text, json or any custome defined types as LogRecord formatter
|
276
308
|
- "type": ["text"/"json"] type of formatter
|
277
309
|
- "delimiter": [any text delimiter you need.(as an instance pipe line "|")]
|
310
|
+
- "colorize": [true/false] default value of this attribute is false.
|
311
|
+
if you need to colorize your out put format on standard output set this attribute to true.
|
278
312
|
if formatter not defined then the json formatter will be used
|
279
313
|
2- file: Store log data in a file.
|
280
314
|
- "type": "console"
|
@@ -302,13 +336,30 @@ the result will be:
|
|
302
336
|
- "type": ["text"/"json"] type of formatter
|
303
337
|
- "delimiter": [any text delimiter you need.(as an instance pipe line "|")]
|
304
338
|
if formatter not defined then the json formatter will be used
|
339
|
+
New Features:
|
340
|
+
* In RTALogger version 2.1.0 and above defineing filters is possible for each repository.
|
341
|
+
* Repositories filtes could restrict the amount of data stored by specific repository.
|
342
|
+
* Also you can add new repositories and filters at run time.
|
343
|
+
* filters configuration: It's possible to apply multiple filters on a repository. When repository will
|
344
|
+
flush a log_record only if the record pass all filter conditions.
|
345
|
+
* There are variaty of filter types, including:
|
346
|
+
'topic' which apply a regular expresion on log_record.topic_title to pass filtering condition.
|
347
|
+
'context' which apply a regular expresion on log_record.context_id to pass filtering condition.
|
348
|
+
'message' which apply a regular expression on log_record.full_message to pass filtering condition.
|
349
|
+
* Each filter has following attributes to counfigure:
|
350
|
+
"type": ["topic"/"context"/"message" or any customized filter] described in previous lines.
|
351
|
+
"title": "filte_title" a unique title to make filter run time configuration
|
352
|
+
"enable": [true/false] this will enable or disable filtering opration of current filter.
|
353
|
+
"default_regex": "valid regual expression" to compare with corresponding attribute.
|
354
|
+
* It's possible to implement customize filter classes and integerate with RTALogger filter factory.
|
355
|
+
* In RTALogger version 2.2.0 colorize out put format is availabel.
|
305
356
|
- topics: This is an optional item. When you need to customize a specific topic severity level or
|
306
357
|
enable value, you can define the settings here.
|
307
358
|
- title: The topic title to customize. (mandatoy).
|
308
359
|
- severity_level: Defines which level of log data will be stored in log repositories.
|
309
360
|
- enable: [true/false] to enable or disable logging process of the topic.
|
310
361
|
```
|
311
|
-
|
362
|
+
##Some useful features
|
312
363
|
```ruby
|
313
364
|
# change log manager app name at run time
|
314
365
|
log_manager.app_name = 'myTestApp'
|
@@ -341,17 +392,19 @@ the result will be:
|
|
341
392
|
# log_manager.enable
|
342
393
|
# log_manager.default_severity_level
|
343
394
|
# log_manager.buffer_size (minimum is 100)
|
344
|
-
# log_manager.flush_wait_time (minimum
|
395
|
+
# log_manager.flush_wait_time (minimum 5 second)
|
345
396
|
# repository.enable
|
346
397
|
# topic.enable
|
347
398
|
# topic.severity_level
|
348
399
|
# Other attributes could only change via config file via manager config_use_json_file
|
400
|
+
# In RTALogger version 2.1.0 and above, it is possible to add new repositories or repository filters at run time
|
401
|
+
# using log_manager.apply_run_time_config method.
|
349
402
|
log_manager.apply_run_time_config(config_json)
|
350
403
|
```
|
351
404
|
### Implement and Expand
|
352
|
-
#### Implement new log repository
|
405
|
+
#### Implement new customized log repository
|
353
406
|
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.
|
407
|
+
integrate new customized log repository with RTALogger LogManager factory.
|
355
408
|
|
356
409
|
1- Define you class inside RTALogger module.
|
357
410
|
|
@@ -396,6 +449,91 @@ module RTALogger
|
|
396
449
|
end
|
397
450
|
```
|
398
451
|
|
452
|
+
#### Implement new customized log repository filter
|
453
|
+
It is possible to implement new log repository filter. There will be fue rules to implement and
|
454
|
+
integrate new customized log repository filter with RTALogger LogManager factory.
|
455
|
+
|
456
|
+
1- Define you class inside RTALogger module.
|
457
|
+
|
458
|
+
2- The class should be inherited from 'RTALogger::LogFilterBase'.
|
459
|
+
|
460
|
+
3- Also appropriate naming convention is necessary.
|
461
|
+
As an example if you are implementing a Console Repo, your class name should be LogFilterTopic and
|
462
|
+
your source code should be placed in a ruby file and name it log_filter_topic.rb
|
463
|
+
|
464
|
+
4- After implementing your own log filter, you should register the class at run-time using the following syntax:
|
465
|
+
```ruby
|
466
|
+
RTALogger::LogFactory.register_log_filter :topic, 'log_filter_topic.rb'
|
467
|
+
```
|
468
|
+
Another example: LogFilterMyCustomizedFilter
|
469
|
+
|
470
|
+
```ruby
|
471
|
+
RTALogger::LogFactory.register_log_filter :my_customized_filter, 'log_repository_my_customized_filter.rb'
|
472
|
+
```
|
473
|
+
Here is 'LogRepositoryTopic' implementation:
|
474
|
+
```ruby
|
475
|
+
require_relative 'log_filter_base'
|
476
|
+
|
477
|
+
module RTALogger
|
478
|
+
class LogFilterTopic < LogFilterBase
|
479
|
+
def match_conditions(log_record)
|
480
|
+
return true if !@enable
|
481
|
+
result = super
|
482
|
+
return result unless result
|
483
|
+
|
484
|
+
return default_regex.present? ? (Regexp.new(@default_regex).match(log_record.topic_title)) : result
|
485
|
+
end
|
486
|
+
end
|
487
|
+
end
|
488
|
+
```
|
489
|
+
#### Implement new customized log formatter
|
490
|
+
|
491
|
+
It is possible to implement new log formatter. There will be fue rules to implement and
|
492
|
+
integrate new customized log formatter with RTALogger LogManager factory.
|
493
|
+
|
494
|
+
1- Define you class inside RTALogger module.
|
495
|
+
|
496
|
+
2- The class should be inherited from 'RTALogger::LogFormatter'.
|
497
|
+
|
498
|
+
3- Also appropriate naming convention is necessary.
|
499
|
+
As an example if you are implementing a Text formatter, your class name should be LogFormatterText and
|
500
|
+
your source code should be placed in a ruby file and name it log_formatter_text.rb
|
501
|
+
|
502
|
+
4- After implementing your own log formatter, you should register the class at run-time using the following syntax:
|
503
|
+
```ruby
|
504
|
+
RTALogger::LogFactory.register_log_formatter :text, 'log_formatter_text.rb'
|
505
|
+
```
|
506
|
+
Another example: LogFormatterMyCustomizedFormatter
|
507
|
+
|
508
|
+
```ruby
|
509
|
+
RTALogger::LogFactory.register_log_formatter :my_customized_formatter, 'log_formatter_my_customized_formatter.rb'
|
510
|
+
```
|
511
|
+
Here is 'LogFormatterText' implementation:
|
512
|
+
```ruby
|
513
|
+
require_relative 'log_formatter_base'
|
514
|
+
require_relative 'severity_level'
|
515
|
+
|
516
|
+
module RTALogger
|
517
|
+
# text formatter which receive log_record and
|
518
|
+
# returns it's data as delimited text string
|
519
|
+
class LogFormatterText < LogFormatterBase
|
520
|
+
include SeverityLevel
|
521
|
+
|
522
|
+
def format(log_record)
|
523
|
+
return '' unless log_record
|
524
|
+
|
525
|
+
result = log_record.occurred_at.strftime('%F %H:%M:%S:%3N')
|
526
|
+
result << @delimiter << log_record.app_name
|
527
|
+
result << @delimiter << log_record.topic_title
|
528
|
+
result << @delimiter << log_record.context_id.to_s
|
529
|
+
result << @delimiter << parse_severity_level_to_s(log_record.severity)
|
530
|
+
result << @delimiter << log_record.message.join(' ').gsub(delimiter, '$<$')
|
531
|
+
|
532
|
+
result
|
533
|
+
end
|
534
|
+
end
|
535
|
+
end
|
536
|
+
```
|
399
537
|
## Contributing
|
400
538
|
|
401
539
|
Bug reports and pull requests are welcome on GitHub at https://github.com/BBahrainy/RTALogger.
|
data/lib/RTALogger/version.rb
CHANGED
@@ -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
|
data/lib/log_formatter_base.rb
CHANGED
@@ -1,16 +1,22 @@
|
|
1
1
|
require 'jbuilder'
|
2
2
|
require_relative 'string'
|
3
|
+
require_relative 'severity_level'
|
3
4
|
|
4
5
|
module RTALogger
|
5
6
|
class LogFormatterBase
|
7
|
+
include SeverityLevel
|
8
|
+
|
6
9
|
def initialize
|
7
10
|
@delimiter = '|'
|
11
|
+
@colorize = false
|
8
12
|
end
|
9
13
|
|
10
14
|
attr_accessor :delimiter
|
15
|
+
attr_accessor :colorize
|
11
16
|
|
12
17
|
def load_config(config_json)
|
13
18
|
@delimiter = config_json['delimiter'].nil? ? true : config_json['delimiter']
|
19
|
+
@colorize = config_json['colorize'].nil? ? false : config_json['colorize']
|
14
20
|
end
|
15
21
|
|
16
22
|
def format(log_record)
|
@@ -20,7 +26,8 @@ module RTALogger
|
|
20
26
|
def to_builder
|
21
27
|
jb = Jbuilder.new do |json|
|
22
28
|
json.type self.class.to_s.split('::').last.underscore.sub('log_formatter_', '')
|
23
|
-
json.delimiter delimiter
|
29
|
+
json.delimiter @delimiter
|
30
|
+
json.colorize @colorize
|
24
31
|
end
|
25
32
|
|
26
33
|
jb
|
@@ -29,5 +36,39 @@ module RTALogger
|
|
29
36
|
def reveal_config
|
30
37
|
to_builder.target!
|
31
38
|
end
|
39
|
+
|
40
|
+
def apply_run_time_config(config_json)
|
41
|
+
@delimiter = config_json['delimiter'] unless config_json['delimiter'].nil?
|
42
|
+
@colorize = config_json['colorize'] unless config_json['colorize'].nil?
|
43
|
+
end
|
44
|
+
|
45
|
+
protected
|
46
|
+
|
47
|
+
def severity_text(severity)
|
48
|
+
text = parse_severity_level_to_s(severity)
|
49
|
+
text = severity_colorized_text(severity, text) if @colorize
|
50
|
+
return text
|
51
|
+
end
|
52
|
+
|
53
|
+
def severity_colorized_text(severity, text)
|
54
|
+
case severity
|
55
|
+
when 0
|
56
|
+
text.trace_color
|
57
|
+
when 1
|
58
|
+
text.debug_color
|
59
|
+
when 2
|
60
|
+
text
|
61
|
+
when 3
|
62
|
+
text.warning_color
|
63
|
+
when 4
|
64
|
+
text.error_color
|
65
|
+
when 5
|
66
|
+
text.fatal_color
|
67
|
+
when 6
|
68
|
+
text.unknown_colorj
|
69
|
+
else
|
70
|
+
text
|
71
|
+
end
|
72
|
+
end
|
32
73
|
end
|
33
74
|
end
|
data/lib/log_formatter_json.rb
CHANGED
@@ -1,12 +1,11 @@
|
|
1
1
|
require 'jbuilder'
|
2
2
|
require_relative 'log_formatter_base'
|
3
|
-
require_relative '
|
3
|
+
require_relative 'string'
|
4
4
|
|
5
5
|
module RTALogger
|
6
6
|
# json formatter which receive log_record and
|
7
7
|
# returns it's data as json string
|
8
8
|
class LogFormatterJson < LogFormatterBase
|
9
|
-
include SeverityLevel
|
10
9
|
|
11
10
|
def format(log_record)
|
12
11
|
return '' unless log_record
|
@@ -20,7 +19,21 @@ module RTALogger
|
|
20
19
|
json.message log_record.message.flatten.join(' ')
|
21
20
|
end
|
22
21
|
|
23
|
-
jb.target!
|
22
|
+
result = jb.target!
|
23
|
+
result = colorize_json(result) if @colorize
|
24
|
+
|
25
|
+
return result
|
26
|
+
end
|
27
|
+
|
28
|
+
protected
|
29
|
+
|
30
|
+
def colorize_json(json_text)
|
31
|
+
json_text.gsub(/"severity":"TRACE"/i, '"severity":"TRACE"'.trace_color)
|
32
|
+
.gsub(/"severity":"DEBUG"/i, '"severity":"DEBUG"'.debug_color)
|
33
|
+
.gsub(/"severity":"WARN"/i, '"severity":"WARN"'.warning_color)
|
34
|
+
.gsub(/"severity":"ERROR"/i, '"severity":"ERROR"'.error_color)
|
35
|
+
.gsub(/"severity":"FATAL"/i, '"severity":"FATAL"'.fatal_color)
|
36
|
+
.gsub(/"severity":"UNKNOWN"/i, '"severity":"UNKNOWN"'.unknown_color)
|
24
37
|
end
|
25
38
|
end
|
26
39
|
end
|
data/lib/log_formatter_text.rb
CHANGED
@@ -1,12 +1,9 @@
|
|
1
1
|
require_relative 'log_formatter_base'
|
2
|
-
require_relative 'severity_level'
|
3
2
|
|
4
3
|
module RTALogger
|
5
4
|
# text formatter which receive log_record and
|
6
5
|
# returns it's data as delimited text string
|
7
6
|
class LogFormatterText < LogFormatterBase
|
8
|
-
include SeverityLevel
|
9
|
-
|
10
7
|
def format(log_record)
|
11
8
|
return '' unless log_record
|
12
9
|
|
@@ -14,7 +11,7 @@ module RTALogger
|
|
14
11
|
result << @delimiter << log_record.app_name
|
15
12
|
result << @delimiter << log_record.topic_title
|
16
13
|
result << @delimiter << log_record.context_id.to_s
|
17
|
-
result << @delimiter <<
|
14
|
+
result << @delimiter << severity_text(log_record.severity)
|
18
15
|
result << @delimiter << log_record.message.join(' ').gsub(delimiter, '$<$')
|
19
16
|
|
20
17
|
result
|
data/lib/log_manager.rb
CHANGED
@@ -27,7 +27,7 @@ module RTALogger
|
|
27
27
|
@topic_semaphore = Mutex.new
|
28
28
|
@log_semaphore = Mutex.new
|
29
29
|
self.buffer_size = ENV.fetch('RTA_LOGGER_BUFFER_SIZE', 100)
|
30
|
-
self.flush_wait_time = ENV.fetch('RTA_LOGGER_FLUSH_WAIT_SECONDS',
|
30
|
+
self.flush_wait_time = ENV.fetch('RTA_LOGGER_FLUSH_WAIT_SECONDS', 5)
|
31
31
|
@topics = {}
|
32
32
|
@log_records = []
|
33
33
|
@propagator = LogFactory.new_log_propagator
|
@@ -64,7 +64,7 @@ module RTALogger
|
|
64
64
|
end
|
65
65
|
|
66
66
|
def flush_wait_time=(time_in_seconds)
|
67
|
-
@flush_wait_time = time_in_seconds <
|
67
|
+
@flush_wait_time = time_in_seconds < 5 ? 5 : time_in_seconds
|
68
68
|
end
|
69
69
|
|
70
70
|
def config_use_json_file(file_name, title = '')
|
@@ -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,
|
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 =
|
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.
|
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']
|
data/lib/log_propagator.rb
CHANGED
@@ -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.
|
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
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
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
|
77
|
+
def to_builder
|
78
|
+
result = nil
|
62
79
|
@semaphore.synchronize do
|
63
|
-
@repositories.
|
64
|
-
|
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'], repository_config)
|
96
|
+
add_log_repository(repository)
|
65
97
|
end
|
66
|
-
@records.clear
|
67
98
|
end
|
68
99
|
end
|
100
|
+
|
69
101
|
end
|
70
102
|
end
|
data/lib/log_record.rb
CHANGED
data/lib/log_repository.rb
CHANGED
@@ -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
|
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
|
|
@@ -42,16 +47,21 @@ module RTALogger
|
|
42
47
|
@enable = config_json['enable'].nil? ? true : config_json['enable']
|
43
48
|
@title = config_json['title'].nil? ? self.class.to_s.split('::').last.underscore : config_json['title']
|
44
49
|
formatter_config = config_json['formatter']
|
45
|
-
|
46
|
-
|
47
|
-
|
50
|
+
|
51
|
+
@formatter = LogFactory.create_formatter(formatter_config['type'], formatter_config) if formatter_config && formatter_config['type']
|
52
|
+
|
53
|
+
apply_config_filters(config_json)
|
48
54
|
end
|
49
55
|
|
50
56
|
def to_builder
|
51
57
|
jb = Jbuilder.new do |json|
|
52
58
|
json.type self.class.to_s.split('::').last.underscore.sub('log_repository_', '')
|
59
|
+
json.title @title
|
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,64 @@ module RTALogger
|
|
61
71
|
to_builder.target!
|
62
72
|
end
|
63
73
|
|
64
|
-
def
|
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
|
+
|
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
|
+
@formatter.apply_run_time_config(config_json)
|
90
|
+
apply_run_time_config_filters(config_json)
|
67
91
|
end
|
68
92
|
|
69
93
|
protected
|
70
94
|
|
95
|
+
def apply_config_filters(config_json)
|
96
|
+
config_json['filters']&.each do |filter_config|
|
97
|
+
next if filter_config['type'].nil? || filter_config['title'].nil?
|
98
|
+
filter = LogFactory.create_filter(filter_config['type'], filter_config)
|
99
|
+
@filters[filter_config['title'].to_sym] = filter if filter.present?
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
def apply_run_time_config_filters(config_json)
|
104
|
+
return unless config_json
|
105
|
+
|
106
|
+
config_json['filters']&.each do |filter_config|
|
107
|
+
next if filter_config['title'].nil?
|
108
|
+
filter = filter_by_title(filter_config['title'])
|
109
|
+
if filter.present?
|
110
|
+
filter.apply_run_time_config(filter_config)
|
111
|
+
else
|
112
|
+
filter = LogFactory.create_filter(filter_config['type'], filter_config)
|
113
|
+
@semaphore.synchronize { @filters[filter_config['title'].to_sym] = filter if filter.present? }
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
71
118
|
def flush_and_clear
|
72
119
|
@semaphore.synchronize { @log_records.clear }
|
73
120
|
end
|
74
121
|
|
122
|
+
def filters_accept(log_record)
|
123
|
+
result = true
|
124
|
+
@filters&.keys.each do |filter_key|
|
125
|
+
result = @filters[filter_key.to_sym]&.match_conditions(log_record)
|
126
|
+
break unless result
|
127
|
+
end
|
128
|
+
|
129
|
+
return result
|
130
|
+
end
|
131
|
+
|
75
132
|
attr_reader :log_records
|
76
133
|
attr_reader :semaphore
|
77
134
|
end
|
data/lib/log_repository_file.rb
CHANGED
@@ -31,8 +31,15 @@ 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
|
+
|
40
|
+
@formatter.colorize = false
|
41
|
+
end
|
42
|
+
|
36
43
|
protected
|
37
44
|
|
38
45
|
def create_ruby_logger(file_path, period, shift_size)
|
@@ -45,7 +52,7 @@ module RTALogger
|
|
45
52
|
end
|
46
53
|
|
47
54
|
def flush_and_clear
|
48
|
-
semaphore.synchronize do
|
55
|
+
@semaphore.synchronize do
|
49
56
|
@log_records.each { |log_record| @file_logger.debug(@formatter.format(log_record)) }
|
50
57
|
end
|
51
58
|
super
|
@@ -7,43 +7,87 @@ module RTALogger
|
|
7
7
|
super()
|
8
8
|
@host = host
|
9
9
|
@port = port
|
10
|
-
@
|
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'].
|
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 =
|
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
|
+
|
66
|
+
@formatter.colorize = false
|
67
|
+
end
|
68
|
+
|
33
69
|
protected
|
34
70
|
|
35
71
|
def create_fluentd_logger(host, port, tls_options)
|
72
|
+
return nil unless @enable
|
73
|
+
|
36
74
|
unless tls_options
|
37
75
|
fluent_logger = ::Fluent::Logger::FluentLogger.new(nil, :host => host, :port => port, :use_nonblock => true, :wait_writeable => false)
|
38
76
|
else
|
39
|
-
fluent_logger = ::Fluent::Logger::FluentLogger.new(nil, :host => host,
|
77
|
+
fluent_logger = ::Fluent::Logger::FluentLogger.new(nil, :host => host,
|
78
|
+
:port => port,
|
79
|
+
:tls_options => tls_options,
|
80
|
+
:use_nonblock => true,
|
81
|
+
:wait_writeable => false)
|
40
82
|
end
|
41
83
|
|
42
84
|
fluent_logger
|
43
85
|
end
|
44
86
|
|
45
87
|
def flush_and_clear
|
46
|
-
semaphore.synchronize do
|
88
|
+
@semaphore.synchronize do
|
89
|
+
@fluent_logger = create_fluentd_logger(@host, @port, @tls_options) unless @fluent_logger.present?
|
90
|
+
|
47
91
|
@log_records.each do |log_record|
|
48
92
|
fluent_tag = log_record.app_name + '.' + log_record.topic_title
|
49
93
|
log_json_string = @formatter.format(log_record)
|
@@ -52,6 +96,7 @@ module RTALogger
|
|
52
96
|
@fluent_logger.post(fluent_tag, log_json)
|
53
97
|
end
|
54
98
|
end
|
99
|
+
|
55
100
|
super
|
56
101
|
end
|
57
102
|
end
|
data/lib/log_topic.rb
CHANGED
@@ -59,7 +59,7 @@ module RTALogger
|
|
59
59
|
jb
|
60
60
|
end
|
61
61
|
|
62
|
-
def
|
62
|
+
def apply_run_time_config(config_json)
|
63
63
|
return unless config_json
|
64
64
|
@enable = config_json['enable'] unless config_json['enable'].nil?
|
65
65
|
@severity_level = parse_severity_level_to_i(config_json['severity_level']) unless config_json['severity_level'].nil?
|
data/lib/rta_logger_config.json
CHANGED
@@ -10,7 +10,7 @@
|
|
10
10
|
"app_name": "TestApp",
|
11
11
|
"severity_level": "trace",
|
12
12
|
"buffer_size": 100,
|
13
|
-
"flush_wait_seconds":
|
13
|
+
"flush_wait_seconds": 5,
|
14
14
|
"repositories":
|
15
15
|
[
|
16
16
|
{
|
@@ -20,8 +20,24 @@
|
|
20
20
|
"formatter":
|
21
21
|
{
|
22
22
|
"type": "text",
|
23
|
-
"delimiter": "|"
|
24
|
-
|
23
|
+
"delimiter": "|",
|
24
|
+
"colorize": true
|
25
|
+
},
|
26
|
+
"filters":
|
27
|
+
[
|
28
|
+
{
|
29
|
+
"type": "topic",
|
30
|
+
"title": "topic_filter_1",
|
31
|
+
"enable": false,
|
32
|
+
"default_regex" : "^test$"
|
33
|
+
},
|
34
|
+
{
|
35
|
+
"type": "message",
|
36
|
+
"title": "message_filter_1",
|
37
|
+
"enable": false,
|
38
|
+
"default_regex" : "error"
|
39
|
+
}
|
40
|
+
]
|
25
41
|
},
|
26
42
|
{
|
27
43
|
"type": "file",
|
@@ -37,8 +53,8 @@
|
|
37
53
|
}
|
38
54
|
},
|
39
55
|
{
|
40
|
-
"enable":
|
41
|
-
"title": "
|
56
|
+
"enable": false,
|
57
|
+
"title": "fluentd_repo_1",
|
42
58
|
"type": "fluentd",
|
43
59
|
"host": "localhost",
|
44
60
|
"port": "8888",
|
data/lib/sample.rb
CHANGED
@@ -1,5 +1,14 @@
|
|
1
1
|
require_relative 'log_factory_manager'
|
2
2
|
require_relative 'log_factory_repository'
|
3
|
+
# require_relative 'string'
|
4
|
+
|
5
|
+
# puts 'trace'.gray
|
6
|
+
# puts 'debug'.green
|
7
|
+
# puts 'info'
|
8
|
+
# puts 'warning'.brown
|
9
|
+
# puts 'error'.red
|
10
|
+
# puts 'fatal'.bg_red
|
11
|
+
# puts 'unknown'.bg_cyan
|
3
12
|
|
4
13
|
controller_name = 'test_controller'
|
5
14
|
userID = 5
|
@@ -39,7 +48,7 @@ topic.unknown(userID, 'Controller Name=', controller_name, 'unknown')
|
|
39
48
|
test_topic.error(userID, 'test_topic', 'error')
|
40
49
|
test_topic.fatal(userID, 'test_topic', 'fatal')
|
41
50
|
|
42
|
-
puts log_manager.reveal_config
|
51
|
+
# puts log_manager.reveal_config
|
43
52
|
|
44
53
|
# update specific topic log level if necessary
|
45
54
|
# log_manager.update_topic_level(controller_name, RTALogger::SeverityLevel::INFO)
|
data/lib/string.rb
CHANGED
@@ -1,9 +1,40 @@
|
|
1
1
|
class String
|
2
2
|
def underscore
|
3
3
|
self.gsub(/::/, '/').
|
4
|
-
gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
|
5
|
-
gsub(/([a-z\d])([A-Z])/,'\1_\2').
|
4
|
+
gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2').
|
5
|
+
gsub(/([a-z\d])([A-Z])/, '\1_\2').
|
6
6
|
tr("-", "_").
|
7
7
|
downcase
|
8
8
|
end
|
9
|
+
|
10
|
+
def black; "\e[30m#{self}\e[0m" end
|
11
|
+
def red; "\e[31m#{self}\e[0m" end
|
12
|
+
def green; "\e[32m#{self}\e[0m" end
|
13
|
+
def brown; "\e[33m#{self}\e[0m" end
|
14
|
+
def blue; "\e[34m#{self}\e[0m" end
|
15
|
+
def magenta; "\e[35m#{self}\e[0m" end
|
16
|
+
def cyan; "\e[36m#{self}\e[0m" end
|
17
|
+
def gray; "\e[37m#{self}\e[0m" end
|
18
|
+
|
19
|
+
def bg_black; "\e[40m#{self}\e[0m" end
|
20
|
+
def bg_red; "\e[41m#{self}\e[0m" end
|
21
|
+
def bg_green; "\e[42m#{self}\e[0m" end
|
22
|
+
def bg_brown; "\e[43m#{self}\e[0m" end
|
23
|
+
def bg_blue; "\e[44m#{self}\e[0m" end
|
24
|
+
def bg_magenta; "\e[45m#{self}\e[0m" end
|
25
|
+
def bg_cyan; "\e[46m#{self}\e[0m" end
|
26
|
+
def bg_gray; "\e[47m#{self}\e[0m" end
|
27
|
+
|
28
|
+
def bold; "\e[1m#{self}\e[22m" end
|
29
|
+
def italic; "\e[3m#{self}\e[23m" end
|
30
|
+
def underline; "\e[4m#{self}\e[24m" end
|
31
|
+
def blink; "\e[5m#{self}\e[25m" end
|
32
|
+
def reverse_color; "\e[7m#{self}\e[27m" end
|
33
|
+
|
34
|
+
def trace_color; self.gray end
|
35
|
+
def debug_color; self.green end
|
36
|
+
def warning_color; self.brown end
|
37
|
+
def error_color; self.red end
|
38
|
+
def fatal_color; self.bg_red end
|
39
|
+
def unknown_color; self.bg_cyan end
|
9
40
|
end
|
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
|
4
|
+
version: 2.2.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-
|
11
|
+
date: 2020-12-29 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
|