RTALogger 0.1.0 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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)
|