RTALogger 0.1.0 → 1.0.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/.gitignore +2 -0
- data/.idea/.rakeTasks +7 -0
- data/.idea/RTALogger.iml +29 -0
- data/.idea/misc.xml +7 -0
- data/.idea/modules.xml +8 -0
- data/.idea/vcs.xml +6 -0
- data/Gemfile +1 -0
- data/Gemfile.lock +21 -23
- data/README.md +326 -4
- data/RTALogger.gemspec +2 -1
- data/lib/RTALogger.rb +2 -4
- data/lib/RTALogger/version.rb +1 -1
- data/lib/log_factory_log_formatter.rb +35 -0
- data/lib/{factory/origin/log_factory_manager.rb → log_factory_manager.rb} +1 -3
- data/lib/{factory/origin/log_factory_propagator.rb → log_factory_propagator.rb} +1 -2
- data/lib/{factory/origin/log_factory_record.rb → log_factory_record.rb} +1 -1
- data/lib/log_factory_repository.rb +37 -0
- data/lib/log_factory_topic.rb +12 -0
- data/lib/log_formatter.rb +11 -1
- data/lib/log_formatter_json.rb +4 -2
- data/lib/log_formatter_text.rb +8 -6
- data/lib/log_manager.rb +126 -40
- data/lib/log_propagator.rb +44 -45
- data/lib/log_record.rb +27 -28
- data/lib/log_repository.rb +26 -4
- data/lib/log_repository_console.rb +8 -3
- data/lib/log_repository_file.rb +24 -6
- data/lib/log_repository_fluent.rb +49 -0
- data/lib/log_repository_udp.rb +14 -7
- data/lib/log_topic.rb +26 -18
- data/lib/rta_logger_config.json +59 -0
- data/lib/sample.rb +48 -0
- data/lib/severity_level.rb +60 -0
- metadata +34 -20
- data/lib/factory/origin/log_factory_file_logger.rb +0 -16
- data/lib/factory/origin/log_factory_log_formatter.rb +0 -11
- data/lib/factory/origin/log_factory_repository.rb +0 -44
- data/lib/factory/origin/log_factory_topic.rb +0 -12
- data/lib/log_severity.rb +0 -17
- data/lib/log_test.rb +0 -41
- data/lib/log_test_db.rb +0 -59
data/lib/log_record.rb
CHANGED
@@ -1,28 +1,27 @@
|
|
1
|
-
require 'date'
|
2
|
-
|
3
|
-
module RTALogger
|
4
|
-
# log data structure
|
5
|
-
class LogRecord
|
6
|
-
def initialize(log_topic, context_id, severity, *message)
|
7
|
-
@log_topic = log_topic
|
8
|
-
@context_id = context_id
|
9
|
-
@severity = severity
|
10
|
-
@message = message
|
11
|
-
@occurred_at = DateTime.now
|
12
|
-
end
|
13
|
-
|
14
|
-
attr_reader :context_id
|
15
|
-
attr_reader :severity
|
16
|
-
attr_reader :message
|
17
|
-
attr_reader :occurred_at
|
18
|
-
|
19
|
-
def app_name
|
20
|
-
@log_topic.log_manager.app_name
|
21
|
-
end
|
22
|
-
|
23
|
-
def topic_title
|
24
|
-
@log_topic.
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
1
|
+
require 'date'
|
2
|
+
|
3
|
+
module RTALogger
|
4
|
+
# log data structure
|
5
|
+
class LogRecord
|
6
|
+
def initialize(log_topic, context_id, severity, *message)
|
7
|
+
@log_topic = log_topic
|
8
|
+
@context_id = context_id
|
9
|
+
@severity = severity
|
10
|
+
@message = message
|
11
|
+
@occurred_at = DateTime.now
|
12
|
+
end
|
13
|
+
|
14
|
+
attr_reader :context_id
|
15
|
+
attr_reader :severity
|
16
|
+
attr_reader :message
|
17
|
+
attr_reader :occurred_at
|
18
|
+
|
19
|
+
def app_name
|
20
|
+
@log_topic.log_manager.app_name
|
21
|
+
end
|
22
|
+
|
23
|
+
def topic_title
|
24
|
+
@log_topic.title
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
data/lib/log_repository.rb
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
require 'thread'
|
2
|
-
|
3
1
|
module RTALogger
|
4
2
|
# base log repository class
|
5
3
|
class LogRepository
|
@@ -9,6 +7,23 @@ module RTALogger
|
|
9
7
|
@enable = true
|
10
8
|
end
|
11
9
|
|
10
|
+
# @@sub_classes = {}
|
11
|
+
|
12
|
+
# def self.create type
|
13
|
+
# requested_class = @@sub_classes[type]
|
14
|
+
# if requested_class
|
15
|
+
# requested_class.new
|
16
|
+
# else
|
17
|
+
# raise "Bad log repository type: #{type}"
|
18
|
+
# end
|
19
|
+
# end
|
20
|
+
#
|
21
|
+
# def self.register repository_name
|
22
|
+
# @@sub_classes[repository_name] = self
|
23
|
+
# end
|
24
|
+
|
25
|
+
attr_accessor :enable
|
26
|
+
|
12
27
|
def add_log_records(items)
|
13
28
|
return 0 unless @enable
|
14
29
|
@semaphore.synchronize do
|
@@ -17,7 +32,14 @@ module RTALogger
|
|
17
32
|
flush_and_clear
|
18
33
|
end
|
19
34
|
|
20
|
-
|
35
|
+
def load_config(config_json)
|
36
|
+
@enable = config_json['enable'].nil? ? true : config_json['enable']
|
37
|
+
|
38
|
+
formatter_config = config_json['formatter']
|
39
|
+
if formatter_config && formatter_config['type']
|
40
|
+
@formatter = LogFactory.create_formatter(formatter_config['type'], formatter_config)
|
41
|
+
end
|
42
|
+
end
|
21
43
|
|
22
44
|
protected
|
23
45
|
|
@@ -28,4 +50,4 @@ module RTALogger
|
|
28
50
|
attr_reader :log_records
|
29
51
|
attr_reader :semaphore
|
30
52
|
end
|
31
|
-
end
|
53
|
+
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
require_relative 'log_repository'
|
2
|
-
require_relative '
|
2
|
+
require_relative 'log_factory_log_formatter'
|
3
3
|
|
4
4
|
module RTALogger
|
5
5
|
# show log items on console out put
|
@@ -7,9 +7,15 @@ module RTALogger
|
|
7
7
|
def initialize
|
8
8
|
super
|
9
9
|
|
10
|
-
@formatter = RTALogger::LogFactory
|
10
|
+
@formatter = RTALogger::LogFactory.log_formatter_default
|
11
11
|
end
|
12
12
|
|
13
|
+
def load_config(config_json)
|
14
|
+
super
|
15
|
+
end
|
16
|
+
|
17
|
+
# register :console
|
18
|
+
|
13
19
|
protected
|
14
20
|
|
15
21
|
def flush_and_clear
|
@@ -18,6 +24,5 @@ module RTALogger
|
|
18
24
|
end
|
19
25
|
super
|
20
26
|
end
|
21
|
-
|
22
27
|
end
|
23
28
|
end
|
data/lib/log_repository_file.rb
CHANGED
@@ -1,25 +1,43 @@
|
|
1
1
|
require 'logger'
|
2
2
|
require_relative 'log_repository'
|
3
|
-
require_relative '
|
4
|
-
require_relative 'factory/origin/log_factory_log_formatter'
|
3
|
+
require_relative 'log_factory_log_formatter'
|
5
4
|
|
6
5
|
module RTALogger
|
7
6
|
# show log items on console out put
|
8
7
|
class LogRepositoryFile < LogRepository
|
9
|
-
def initialize(file_path = 'log.txt', period = 'daily', shift_size =
|
8
|
+
def initialize(file_path = 'log.txt', period = 'daily', shift_size = 1_048_576)
|
10
9
|
super()
|
11
|
-
@file_logger =
|
12
|
-
@formatter = RTALogger::LogFactory
|
10
|
+
@file_logger = create_ruby_logger(file_path, period, shift_size)
|
11
|
+
@formatter = RTALogger::LogFactory.log_formatter_default
|
13
12
|
end
|
14
13
|
|
14
|
+
def load_config(config_json)
|
15
|
+
super
|
16
|
+
|
17
|
+
file_path = config_json['file_path'].to_s
|
18
|
+
period = config_json['roll_period'].to_s
|
19
|
+
shift_size = config_json['roll_size'].nil? ? 1_048_576 : config_json['roll_size'].to_i
|
20
|
+
@file_logger = create_ruby_logger(file_path, period, shift_size)
|
21
|
+
end
|
22
|
+
|
23
|
+
# register :file
|
24
|
+
|
15
25
|
protected
|
16
26
|
|
27
|
+
def create_ruby_logger(file_path, period, shift_size)
|
28
|
+
ruby_logger = Logger.new(file_path, period, shift_size)
|
29
|
+
ruby_logger.level = Logger::Severity::DEBUG
|
30
|
+
ruby_logger.formatter = proc do |_severity, _datetime, _progname, msg|
|
31
|
+
"#{msg}\n"
|
32
|
+
end
|
33
|
+
ruby_logger
|
34
|
+
end
|
35
|
+
|
17
36
|
def flush_and_clear
|
18
37
|
semaphore.synchronize do
|
19
38
|
@log_records.each { |log_record| @file_logger.debug(@formatter.format(log_record)) }
|
20
39
|
end
|
21
40
|
super
|
22
41
|
end
|
23
|
-
|
24
42
|
end
|
25
43
|
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'fluent-logger'
|
2
|
+
require_relative 'log_repository'
|
3
|
+
|
4
|
+
module RTALogger
|
5
|
+
class LogRepositoryFluent < LogRepository
|
6
|
+
def initialize(host = 'localhost', port = 24224, tls_options = nil)
|
7
|
+
super()
|
8
|
+
@formatter = RTALogger::LogFactory.log_formatter_json
|
9
|
+
@fluent_logger = create_fluentd_logger(host, port, tls_options)
|
10
|
+
end
|
11
|
+
|
12
|
+
def load_config(config_json)
|
13
|
+
super
|
14
|
+
|
15
|
+
host = config_json['host'].to_s
|
16
|
+
port = config_json['port'].to_s
|
17
|
+
tls_options = config_json['tls_options']
|
18
|
+
|
19
|
+
@fluent_logger = create_fluentd_logger(host, port, tls_options)
|
20
|
+
end
|
21
|
+
|
22
|
+
# register :fluentd
|
23
|
+
|
24
|
+
protected
|
25
|
+
|
26
|
+
def create_fluentd_logger(host, port, tls_options)
|
27
|
+
unless tls_options
|
28
|
+
fluent_logger = ::Fluent::Logger::FluentLogger.new(nil, :host => host, :port => port, :use_nonblock => true, :wait_writeable => false)
|
29
|
+
else
|
30
|
+
fluent_logger = ::Fluent::Logger::FluentLogger.new(nil, :host => host, :port => port, :tls_options => tls_options, :use_nonblock => true, :wait_writeable => false)
|
31
|
+
end
|
32
|
+
|
33
|
+
fluent_logger
|
34
|
+
end
|
35
|
+
|
36
|
+
def flush_and_clear
|
37
|
+
semaphore.synchronize do
|
38
|
+
@log_records.each do |log_record|
|
39
|
+
fluent_tag = log_record.app_name + '.' + log_record.topic_title
|
40
|
+
log_json_string = @formatter.format(log_record)
|
41
|
+
log_json = JSON.parse(log_json_string)
|
42
|
+
|
43
|
+
@fluent_logger.post(fluent_tag, log_json)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
super
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
data/lib/log_repository_udp.rb
CHANGED
@@ -5,21 +5,28 @@ module RTALogger
|
|
5
5
|
class LogRepositoryUDP < LogRepository
|
6
6
|
def initialize(host = '127.0.0.1', port = 4913)
|
7
7
|
super()
|
8
|
-
@
|
9
|
-
@
|
8
|
+
@udp_socket = UDPSocket.new
|
9
|
+
@udp_socket.bind(host, port)
|
10
10
|
end
|
11
11
|
|
12
|
+
def load_config(config_json)
|
13
|
+
super
|
14
|
+
|
15
|
+
host = config_json['host'].to_s
|
16
|
+
port = config_json['port'].nil? ? 4913 : config_json['port'].to_i
|
17
|
+
@udp_socket = UDPSocket.new
|
18
|
+
@udp_socket.bind(host, port)
|
19
|
+
end
|
20
|
+
|
21
|
+
# register :udp
|
22
|
+
|
12
23
|
protected
|
13
24
|
|
14
25
|
def flush_and_clear
|
15
26
|
semaphore.synchronize do
|
16
|
-
|
17
|
-
u1.bind(@host, @port)
|
18
|
-
@log_records.each { |log_record| u1.send log_record.to_s, 0, @host, @port}
|
19
|
-
u1.close
|
27
|
+
@log_records.each { |log_record| @udp_socket.send @formatter.format(log_record), 0, @host, @port }
|
20
28
|
end
|
21
29
|
super
|
22
30
|
end
|
23
|
-
|
24
31
|
end
|
25
32
|
end
|
data/lib/log_topic.rb
CHANGED
@@ -1,51 +1,59 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
require_relative 'factory/origin/log_factory_record'
|
1
|
+
require_relative 'severity_level'
|
2
|
+
require_relative 'log_factory_record'
|
3
|
+
require 'jbuilder'
|
5
4
|
|
6
5
|
module RTALogger
|
7
|
-
# the main class to logging data
|
6
|
+
# the main class to logging data as topic
|
8
7
|
class LogTopic
|
9
|
-
include
|
8
|
+
include SeverityLevel
|
10
9
|
include RTALogger::LogFactory
|
11
10
|
|
12
|
-
def initialize(log_manager,
|
11
|
+
def initialize(log_manager, title, severity_level = WARN, enable = true)
|
13
12
|
# Logger logger = Logger.new(Logger::DEBUG)
|
14
|
-
@enable =
|
13
|
+
@enable = enable
|
15
14
|
@log_manager = log_manager
|
16
|
-
@
|
17
|
-
@
|
15
|
+
@title = title.to_s.dup
|
16
|
+
@severity_level = severity_level
|
18
17
|
end
|
19
18
|
|
20
19
|
attr_accessor :enable
|
21
20
|
attr_reader :log_manager
|
22
|
-
attr_reader :
|
23
|
-
attr_accessor :
|
21
|
+
attr_reader :title
|
22
|
+
attr_accessor :severity_level
|
24
23
|
|
25
24
|
def debug(context_id, *message)
|
26
|
-
add(context_id, DEBUG, message) if @
|
25
|
+
add(context_id, DEBUG, message) if @severity_level.to_i <= DEBUG.to_i
|
27
26
|
end
|
28
27
|
|
29
28
|
def info(context_id, *message)
|
30
|
-
add(context_id, INFO, message) if @
|
29
|
+
add(context_id, INFO, message) if @severity_level.to_i <= INFO.to_i
|
31
30
|
end
|
32
31
|
|
33
32
|
def warning(context_id, *message)
|
34
|
-
add(context_id, WARN, message) if @
|
33
|
+
add(context_id, WARN, message) if @severity_level.to_i <= WARN.to_i
|
35
34
|
end
|
36
35
|
|
37
36
|
def error(context_id, *message)
|
38
|
-
add(context_id, ERROR, message) if @
|
37
|
+
add(context_id, ERROR, message) if @severity_level.to_i <= ERROR.to_i
|
39
38
|
end
|
40
39
|
|
41
40
|
def fatal(context_id, *message)
|
42
|
-
add(context_id, FATAL, message) if @
|
41
|
+
add(context_id, FATAL, message) if @severity_level.to_i <= FATAL.to_i
|
43
42
|
end
|
44
43
|
|
45
44
|
def unknown(context_id, *message)
|
46
|
-
add(context_id, UNKNOWN, message) if @
|
45
|
+
add(context_id, UNKNOWN, message) if @severity_level.to_i <= UNKNOWN.to_i
|
47
46
|
end
|
48
47
|
|
48
|
+
def to_builder
|
49
|
+
jb = Jbuilder.new do |json|
|
50
|
+
json.title title
|
51
|
+
json.severity_level parse_severity_level_to_s(severity_level)
|
52
|
+
json.enable enable
|
53
|
+
end
|
54
|
+
|
55
|
+
jb
|
56
|
+
end
|
49
57
|
private
|
50
58
|
|
51
59
|
def add(context_id, severity, *message)
|
@@ -0,0 +1,59 @@
|
|
1
|
+
{
|
2
|
+
"rta_logger":
|
3
|
+
{
|
4
|
+
"default_manager": "develop",
|
5
|
+
"log_managers":
|
6
|
+
[
|
7
|
+
{
|
8
|
+
"manager_name": "develop",
|
9
|
+
"enable": true,
|
10
|
+
"app_name": "TestApp",
|
11
|
+
"severity_level": "debug",
|
12
|
+
"buffer_size": 100,
|
13
|
+
"flush_wait_seconds": 15,
|
14
|
+
"repos":
|
15
|
+
[
|
16
|
+
{
|
17
|
+
"enable": true,
|
18
|
+
"type": "console",
|
19
|
+
"formatter":
|
20
|
+
{
|
21
|
+
"type": "text",
|
22
|
+
"delimiter": "|"
|
23
|
+
}
|
24
|
+
},
|
25
|
+
{
|
26
|
+
"enable": true,
|
27
|
+
"type": "file",
|
28
|
+
"file_path": "log.txt",
|
29
|
+
"roll_period": "daily",
|
30
|
+
"roll_size": "1048576",
|
31
|
+
"formatter":
|
32
|
+
{
|
33
|
+
"type": "text",
|
34
|
+
"delimiter": "|"
|
35
|
+
}
|
36
|
+
},
|
37
|
+
{
|
38
|
+
"enable": true,
|
39
|
+
"type": "fluentd",
|
40
|
+
"host": "localhost",
|
41
|
+
"port": "8888",
|
42
|
+
"formatter":
|
43
|
+
{
|
44
|
+
"type": "json"
|
45
|
+
}
|
46
|
+
}
|
47
|
+
],
|
48
|
+
"topics":
|
49
|
+
[
|
50
|
+
{
|
51
|
+
"title": "test",
|
52
|
+
"enable": true,
|
53
|
+
"severity_level": "WARN"
|
54
|
+
}
|
55
|
+
]
|
56
|
+
}
|
57
|
+
]
|
58
|
+
}
|
59
|
+
}
|
data/lib/sample.rb
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
require_relative 'log_factory_manager'
|
2
|
+
require_relative 'log_factory_repository'
|
3
|
+
|
4
|
+
controller_name = 'test_controller'
|
5
|
+
userID = 5
|
6
|
+
|
7
|
+
|
8
|
+
# RTALogger::LogFactory.register_log_repository :console, 'log_repository_console.rb'
|
9
|
+
|
10
|
+
# create log manager instance
|
11
|
+
# this could be a global variable declared in application level
|
12
|
+
log_manager = RTALogger::LogFactory.log_manager_instance
|
13
|
+
|
14
|
+
# set log manage application name (hard code)
|
15
|
+
log_manager.app_name = 'myTestApp'
|
16
|
+
|
17
|
+
# load log manager configuration from a json config file
|
18
|
+
log_manager.config_use_json_file('rta_logger_config.json')
|
19
|
+
|
20
|
+
# add log repository to log manager
|
21
|
+
#log_manager.propagator.add_log_repository(RTALogger::LogFactory.new_log_repository_console)
|
22
|
+
|
23
|
+
# add new topic to log manager
|
24
|
+
# use this api to get a new log topic instance
|
25
|
+
# this api could be called in entry point of each service or class initialize method
|
26
|
+
topic = log_manager.add_topic(controller_name)
|
27
|
+
test_topic = log_manager.add_topic('test')
|
28
|
+
# test_topic.severity_level = ::RTALogger::SeverityLevel::FATAL
|
29
|
+
# test_topic.enable = false
|
30
|
+
|
31
|
+
# add log information to log topic
|
32
|
+
topic.debug(userID, 'Controller Name=', controller_name, 'debug')
|
33
|
+
topic.info(userID, 'Controller Name=', controller_name, 'information')
|
34
|
+
topic.warning(userID, 'Controller Name=', controller_name, 'warning')
|
35
|
+
topic.error(userID, 'Controller Name=', controller_name, 'error')
|
36
|
+
topic.fatal(userID, 'Controller Name=', controller_name, 'fatal')
|
37
|
+
topic.unknown(userID, 'Controller Name=', controller_name, 'unknown')
|
38
|
+
|
39
|
+
test_topic.error(userID, 'test_topic', 'error')
|
40
|
+
test_topic.fatal(userID, 'test_topic', 'fatal')
|
41
|
+
|
42
|
+
puts log_manager.reveal_config
|
43
|
+
|
44
|
+
# update specific topic log level if necessary
|
45
|
+
# log_manager.update_topic_level(controller_name, RTALogger::SeverityLevel::INFO)
|
46
|
+
|
47
|
+
# update all topics log level if necessary
|
48
|
+
# log_manager.update_all_topics_severity_level(RTALogger::SeverityLevel::INFO)
|