RTALogger 0.1.0 → 0.1.1
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 +36 -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 +18 -3
- data/README.md +37 -1
- data/RTALogger.gemspec +1 -0
- data/lib/RTALogger.rb +2 -4
- data/lib/RTALogger/version.rb +1 -1
- data/lib/{factory/origin/log_factory_file_logger.rb → log_factory_file_logger.rb} +3 -2
- data/lib/log_factory_log_formatter.rb +12 -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/{factory/origin/log_factory_repository.rb → log_factory_repository.rb} +8 -9
- data/lib/{factory/origin/log_factory_topic.rb → log_factory_topic.rb} +1 -1
- data/lib/log_formatter.rb +1 -1
- data/lib/log_formatter_json.rb +3 -1
- data/lib/log_formatter_text.rb +9 -7
- data/lib/log_manager.rb +40 -15
- data/lib/log_propagator.rb +44 -45
- data/lib/log_record.rb +27 -28
- data/lib/log_repository.rb +1 -3
- data/lib/log_repository_console.rb +2 -3
- data/lib/log_repository_file.rb +4 -5
- data/lib/log_repository_udp.rb +1 -2
- data/lib/log_severity.rb +1 -1
- data/lib/log_topic.rb +3 -5
- data/lib/rta_logger_config.json +32 -0
- data/lib/sample.rb +37 -0
- metadata +30 -10
- data/lib/factory/origin/log_factory_log_formatter.rb +0 -11
- data/lib/log_test.rb +0 -41
- data/lib/log_test_db.rb +0 -59
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5cd821ed8beebbda5bfd6aff1088372642f5f20012c7f5d6ca8b2d59cc8dee42
|
4
|
+
data.tar.gz: 8dbf6b01f03b98525acade15eaebece1e500dfbc610f2d9cbda5e760df0e048b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7a1e77c33e3fb301780bb6d4a0b254701ab918403ee8705e19bda759b2c0ce56b1e1cf76c18012c195b5c3b28267dea524bbe3db303f7a9fb9dca58662fe9a2f
|
7
|
+
data.tar.gz: fd81ab07bb1a3c79e00e425298068e4cfa357208e4173f157a156e5cdefcb044f456604cfc0c3b9d0f37342e672d47636ffd75ceb4b5ef866a47f8f7db9bc7aa
|
data/.idea/.gitignore
ADDED
data/.idea/.rakeTasks
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<Settings><!--This file was automatically generated by Ruby plugin.
|
3
|
+
You are allowed to:
|
4
|
+
1. Remove rake task
|
5
|
+
2. Add existing rake tasks
|
6
|
+
To add existing rake tasks automatically delete this file and reload the project.
|
7
|
+
--><RakeGroup description="" fullCmd="" taksId="rake"><RakeTask description="Build RTALogger-0.1.0.gem into the pkg directory" fullCmd="build" taksId="build" /><RakeTask description="Remove any temporary products" fullCmd="clean" taksId="clean" /><RakeTask description="Remove any generated files" fullCmd="clobber" taksId="clobber" /><RakeTask description="Build and install RTALogger-0.1.0.gem into system gems" fullCmd="install" taksId="install" /><RakeGroup description="" fullCmd="" taksId="install"><RakeTask description="Build and install RTALogger-0.1.0.gem into system gems without network access" fullCmd="install:local" taksId="local" /></RakeGroup><RakeTask description="Create tag v0.1.0 and build and push RTALogger-0.1.0.gem to https://www.rubygems.org" fullCmd="release[remote]" taksId="release[remote]" /><RakeTask description="Run RSpec code examples" fullCmd="spec" taksId="spec" /></RakeGroup></Settings>
|
data/.idea/RTALogger.iml
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<module type="RUBY_MODULE" version="4">
|
3
|
+
<component name="ModuleRunConfigurationManager">
|
4
|
+
<shared />
|
5
|
+
</component>
|
6
|
+
<component name="NewModuleRootManager">
|
7
|
+
<content url="file://$MODULE_DIR$" />
|
8
|
+
<orderEntry type="inheritedJdk" />
|
9
|
+
<orderEntry type="sourceFolder" forTests="false" />
|
10
|
+
<orderEntry type="library" scope="PROVIDED" name="activesupport (v6.0.3.4, ruby-2.6.3-p62) [gem]" level="application" />
|
11
|
+
<orderEntry type="library" scope="PROVIDED" name="bundler (v2.1.4, ruby-2.6.3-p62) [gem]" level="application" />
|
12
|
+
<orderEntry type="library" scope="PROVIDED" name="concurrent-ruby (v1.1.7, ruby-2.6.3-p62) [gem]" level="application" />
|
13
|
+
<orderEntry type="library" scope="PROVIDED" name="cool.io (v1.7.0, ruby-2.6.3-p62) [gem]" level="application" />
|
14
|
+
<orderEntry type="library" scope="PROVIDED" name="diff-lcs (v1.4.4, ruby-2.6.3-p62) [gem]" level="application" />
|
15
|
+
<orderEntry type="library" scope="PROVIDED" name="fluentd (v1.11.4, ruby-2.6.3-p62) [gem]" level="application" />
|
16
|
+
<orderEntry type="library" scope="PROVIDED" name="http_parser.rb (v0.6.0, ruby-2.6.3-p62) [gem]" level="application" />
|
17
|
+
<orderEntry type="library" scope="PROVIDED" name="i18n (v1.8.5, ruby-2.6.3-p62) [gem]" level="application" />
|
18
|
+
<orderEntry type="library" scope="PROVIDED" name="jbuilder (v2.10.1, ruby-2.6.3-p62) [gem]" level="application" />
|
19
|
+
<orderEntry type="library" scope="PROVIDED" name="minitest (v5.14.2, ruby-2.6.3-p62) [gem]" level="application" />
|
20
|
+
<orderEntry type="library" scope="PROVIDED" name="msgpack (v1.3.3, ruby-2.6.3-p62) [gem]" level="application" />
|
21
|
+
<orderEntry type="library" scope="PROVIDED" name="rake (v12.3.3, ruby-2.6.3-p62) [gem]" level="application" />
|
22
|
+
<orderEntry type="library" scope="PROVIDED" name="rspec (v3.10.0, ruby-2.6.3-p62) [gem]" level="application" />
|
23
|
+
<orderEntry type="library" scope="PROVIDED" name="rspec-core (v3.10.0, ruby-2.6.3-p62) [gem]" level="application" />
|
24
|
+
<orderEntry type="library" scope="PROVIDED" name="rspec-expectations (v3.10.0, ruby-2.6.3-p62) [gem]" level="application" />
|
25
|
+
<orderEntry type="library" scope="PROVIDED" name="rspec-mocks (v3.10.0, ruby-2.6.3-p62) [gem]" level="application" />
|
26
|
+
<orderEntry type="library" scope="PROVIDED" name="rspec-support (v3.10.0, ruby-2.6.3-p62) [gem]" level="application" />
|
27
|
+
<orderEntry type="library" scope="PROVIDED" name="serverengine (v2.2.2, ruby-2.6.3-p62) [gem]" level="application" />
|
28
|
+
<orderEntry type="library" scope="PROVIDED" name="sigdump (v0.2.4, ruby-2.6.3-p62) [gem]" level="application" />
|
29
|
+
<orderEntry type="library" scope="PROVIDED" name="strptime (v0.2.5, ruby-2.6.3-p62) [gem]" level="application" />
|
30
|
+
<orderEntry type="library" scope="PROVIDED" name="thread_safe (v0.3.6, ruby-2.6.3-p62) [gem]" level="application" />
|
31
|
+
<orderEntry type="library" scope="PROVIDED" name="tzinfo (v1.2.7, ruby-2.6.3-p62) [gem]" level="application" />
|
32
|
+
<orderEntry type="library" scope="PROVIDED" name="tzinfo-data (v1.2020.4, ruby-2.6.3-p62) [gem]" level="application" />
|
33
|
+
<orderEntry type="library" scope="PROVIDED" name="yajl-ruby (v1.4.1, ruby-2.6.3-p62) [gem]" level="application" />
|
34
|
+
<orderEntry type="library" scope="PROVIDED" name="zeitwerk (v2.4.1, ruby-2.6.3-p62) [gem]" level="application" />
|
35
|
+
</component>
|
36
|
+
</module>
|
data/.idea/misc.xml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<project version="4">
|
3
|
+
<component name="JavaScriptSettings">
|
4
|
+
<option name="languageLevel" value="ES6" />
|
5
|
+
</component>
|
6
|
+
<component name="ProjectRootManager" version="2" project-jdk-name="ruby-2.6.3-p62" project-jdk-type="RUBY_SDK" />
|
7
|
+
</project>
|
data/.idea/modules.xml
ADDED
@@ -0,0 +1,8 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<project version="4">
|
3
|
+
<component name="ProjectModuleManager">
|
4
|
+
<modules>
|
5
|
+
<module fileurl="file://$PROJECT_DIR$/.idea/RTALogger.iml" filepath="$PROJECT_DIR$/.idea/RTALogger.iml" />
|
6
|
+
</modules>
|
7
|
+
</component>
|
8
|
+
</project>
|
data/.idea/vcs.xml
ADDED
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,12 +1,19 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
RTALogger (0.1.
|
4
|
+
RTALogger (0.1.1)
|
5
5
|
fluentd (~> 1.11, >= 1.11.4)
|
6
|
+
jbuilder (~> 2.10)
|
6
7
|
|
7
8
|
GEM
|
8
9
|
remote: https://rubygems.org/
|
9
10
|
specs:
|
11
|
+
activesupport (6.0.3.4)
|
12
|
+
concurrent-ruby (~> 1.0, >= 1.0.2)
|
13
|
+
i18n (>= 0.7, < 2)
|
14
|
+
minitest (~> 5.1)
|
15
|
+
tzinfo (~> 1.1)
|
16
|
+
zeitwerk (~> 2.2, >= 2.2.2)
|
10
17
|
concurrent-ruby (1.1.7)
|
11
18
|
cool.io (1.7.0)
|
12
19
|
diff-lcs (1.4.4)
|
@@ -21,6 +28,11 @@ GEM
|
|
21
28
|
tzinfo-data (~> 1.0)
|
22
29
|
yajl-ruby (~> 1.0)
|
23
30
|
http_parser.rb (0.6.0)
|
31
|
+
i18n (1.8.5)
|
32
|
+
concurrent-ruby (~> 1.0)
|
33
|
+
jbuilder (2.10.1)
|
34
|
+
activesupport (>= 5.0.0)
|
35
|
+
minitest (5.14.2)
|
24
36
|
msgpack (1.3.3)
|
25
37
|
rake (12.3.3)
|
26
38
|
rspec (3.10.0)
|
@@ -40,17 +52,20 @@ GEM
|
|
40
52
|
sigdump (~> 0.2.2)
|
41
53
|
sigdump (0.2.4)
|
42
54
|
strptime (0.2.5)
|
43
|
-
|
44
|
-
|
55
|
+
thread_safe (0.3.6)
|
56
|
+
tzinfo (1.2.7)
|
57
|
+
thread_safe (~> 0.1)
|
45
58
|
tzinfo-data (1.2020.4)
|
46
59
|
tzinfo (>= 1.0.0)
|
47
60
|
yajl-ruby (1.4.1)
|
61
|
+
zeitwerk (2.4.1)
|
48
62
|
|
49
63
|
PLATFORMS
|
50
64
|
ruby
|
51
65
|
|
52
66
|
DEPENDENCIES
|
53
67
|
RTALogger!
|
68
|
+
jbuilder
|
54
69
|
rake (~> 12.0)
|
55
70
|
rspec (~> 3.0)
|
56
71
|
|
data/README.md
CHANGED
@@ -22,7 +22,43 @@ Or install it yourself as:
|
|
22
22
|
|
23
23
|
## Usage
|
24
24
|
|
25
|
-
|
25
|
+
require_relative 'log_factory_manager'
|
26
|
+
require_relative 'log_factory_repository'
|
27
|
+
|
28
|
+
controller_name = 'test_controller'
|
29
|
+
userID = 5
|
30
|
+
|
31
|
+
# create log manager instance
|
32
|
+
# this could be a global variable declared in application level
|
33
|
+
log_manager = RTALogger::LogFactory.log_manager_instance
|
34
|
+
|
35
|
+
# set log manage application name (hard code)
|
36
|
+
log_manager.app_name = 'myTestApp'
|
37
|
+
|
38
|
+
# load log manager configuration from a json config file
|
39
|
+
log_manager.config_use_json_file('rta_logger_config.json')
|
40
|
+
|
41
|
+
# add log repository to log manager
|
42
|
+
#log_manager.propagator.add_log_repository(RTALogger::LogFactory.new_log_repository_console)
|
43
|
+
|
44
|
+
# add new topic to log manager
|
45
|
+
# use this api to get a new log topic instance
|
46
|
+
# this api could be called in entry point of each service or class initialize method
|
47
|
+
topic = log_manager.add_topic(controller_name)
|
48
|
+
|
49
|
+
# add log information to log topic
|
50
|
+
topic.debug(userID, 'Controller Name=', controller_name, 'debug')
|
51
|
+
topic.info(userID, 'Controller Name=', controller_name, 'information')
|
52
|
+
topic.warning(userID, 'Controller Name=', controller_name, 'warning')
|
53
|
+
topic.error(userID, 'Controller Name=', controller_name, 'error')
|
54
|
+
topic.fatal(userID, 'Controller Name=', controller_name, 'fatal')
|
55
|
+
topic.unknown(userID, 'Controller Name=', controller_name, 'unknown')
|
56
|
+
|
57
|
+
# update specific topic log level if necessary
|
58
|
+
# log_manager.update_topic_level(controller_name, RTALogger::LogSeverity::INFO)
|
59
|
+
|
60
|
+
# update all topics log level if necessary
|
61
|
+
# log_manager.update_all_topics_log_level(RTALogger::LogSeverity::INFO)
|
26
62
|
|
27
63
|
## Development
|
28
64
|
|
data/RTALogger.gemspec
CHANGED
data/lib/RTALogger.rb
CHANGED
data/lib/RTALogger/version.rb
CHANGED
@@ -1,13 +1,14 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require 'logger'
|
3
4
|
|
4
5
|
module RTALogger
|
5
6
|
# this module generates object instance
|
6
7
|
module LogFactory
|
7
|
-
def self.new_file_logger(file_path = 'log.txt', period = 'daily', shift_size =
|
8
|
+
def self.new_file_logger(file_path = 'log.txt', period = 'daily', shift_size = 1_048_576)
|
8
9
|
@ruby_logger = Logger.new(file_path, period, shift_size)
|
9
10
|
@ruby_logger.level = Logger::Severity::DEBUG
|
10
|
-
@ruby_logger.formatter = proc do |
|
11
|
+
@ruby_logger.formatter = proc do |_severity, _datetime, _progname, msg|
|
11
12
|
"#{msg}\n"
|
12
13
|
end
|
13
14
|
@ruby_logger
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require_relative 'log_formatter_text'
|
2
|
+
require_relative 'log_formatter_json'
|
3
|
+
|
4
|
+
module RTALogger
|
5
|
+
# Log factory to get new instance of log formatter
|
6
|
+
module LogFactory
|
7
|
+
def self.log_formatter_default
|
8
|
+
RTALogger::LogFormatterJSON.new
|
9
|
+
# RTALogger::LogFormatterText.new
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative '
|
3
|
+
require_relative 'log_manager'
|
4
4
|
|
5
5
|
module RTALogger
|
6
6
|
# this module generates object instance
|
@@ -8,7 +8,5 @@ module RTALogger
|
|
8
8
|
def self.log_manager_instance
|
9
9
|
RTALogger::LogManager.instance
|
10
10
|
end
|
11
|
-
|
12
|
-
|
13
11
|
end
|
14
12
|
end
|
@@ -1,9 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative '
|
4
|
-
require_relative '
|
5
|
-
require_relative '
|
6
|
-
#require_relative '../../log_repository_db'
|
3
|
+
require_relative 'log_repository_console'
|
4
|
+
require_relative 'log_repository_file'
|
5
|
+
require_relative 'log_repository_udp'
|
7
6
|
|
8
7
|
module RTALogger
|
9
8
|
# this module generates object instance
|
@@ -12,14 +11,14 @@ module RTALogger
|
|
12
11
|
LogRepositoryConsole.new
|
13
12
|
end
|
14
13
|
|
15
|
-
def self.new_log_repository_file(file_path = 'log.txt', period = 'daily', shift_size =
|
14
|
+
def self.new_log_repository_file(file_path = 'log.txt', period = 'daily', shift_size = 1_048_576)
|
16
15
|
LogRepositoryFile.new(file_path, period, shift_size)
|
17
16
|
end
|
18
17
|
|
19
18
|
def self.load_log_repository_file(config_json)
|
20
19
|
file_path = config_json['File_Path'].to_s
|
21
20
|
period = config_json['Roll_Period'].to_s
|
22
|
-
shift_size = config_json['Roll_Size'].nil? ?
|
21
|
+
shift_size = config_json['Roll_Size'].nil? ? 1_048_576 : config_json['Roll_Size'].to_i
|
23
22
|
::RTALogger::LogFactory.new_log_repository_file(file_path, period, shift_size)
|
24
23
|
end
|
25
24
|
|
@@ -35,9 +34,9 @@ module RTALogger
|
|
35
34
|
|
36
35
|
def self.create_repository(type, config_json)
|
37
36
|
result = nil
|
38
|
-
result = new_log_repository_console if type.to_s.
|
39
|
-
result = load_log_repository_file(config_json) if type.to_s.
|
40
|
-
result = load_log_repository_udp(config_json) if type.to_s.
|
37
|
+
result = new_log_repository_console if type.to_s.casecmp('Console').zero?
|
38
|
+
result = load_log_repository_file(config_json) if type.to_s.casecmp('File').zero?
|
39
|
+
result = load_log_repository_udp(config_json) if type.to_s.casecmp('UDP').zero?
|
41
40
|
result
|
42
41
|
end
|
43
42
|
end
|
data/lib/log_formatter.rb
CHANGED
data/lib/log_formatter_json.rb
CHANGED
@@ -2,12 +2,14 @@ require 'jbuilder'
|
|
2
2
|
require_relative 'log_formatter'
|
3
3
|
|
4
4
|
module RTALogger
|
5
|
+
# json formatter which receive log_record and
|
6
|
+
# returns it's data as json string
|
5
7
|
class LogFormatterJSON
|
6
8
|
def format(log_record)
|
7
9
|
return '' unless log_record
|
8
10
|
|
9
11
|
jb = Jbuilder.new do |json|
|
10
|
-
json.occurred_at log_record.occurred_at.strftime(
|
12
|
+
json.occurred_at log_record.occurred_at.strftime('%F %H:%M:%S:%3N')
|
11
13
|
json.app_name log_record.app_name
|
12
14
|
json.topic_title log_record.topic_title
|
13
15
|
json.context_id log_record.context_id
|
data/lib/log_formatter_text.rb
CHANGED
@@ -1,16 +1,18 @@
|
|
1
1
|
require_relative 'log_formatter'
|
2
2
|
|
3
3
|
module RTALogger
|
4
|
+
# text formatter which receive log_record and
|
5
|
+
# returns it's data as delimited text string
|
4
6
|
class LogFormatterText < LogFormatter
|
5
|
-
def format(log_record)
|
7
|
+
def format(log_record, delimiter = '|')
|
6
8
|
return '' unless log_record
|
7
9
|
|
8
|
-
result = log_record.occurred_at.strftime(
|
9
|
-
result <<
|
10
|
-
result <<
|
11
|
-
result <<
|
12
|
-
result <<
|
13
|
-
result <<
|
10
|
+
result = log_record.occurred_at.strftime('%F %H:%M:%S:%3N')
|
11
|
+
result << delimiter << log_record.app_name
|
12
|
+
result << delimiter << log_record.topic_title
|
13
|
+
result << delimiter << log_record.context_id
|
14
|
+
result << delimiter << log_record.severity
|
15
|
+
result << delimiter << log_record.message.join(' ').gsub(delimiter, '$<$')
|
14
16
|
|
15
17
|
result
|
16
18
|
end
|
data/lib/log_manager.rb
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
require 'date'
|
2
2
|
require 'thread'
|
3
3
|
require 'singleton'
|
4
|
-
require_relative '
|
5
|
-
require_relative '
|
6
|
-
require_relative '
|
7
|
-
require_relative '
|
4
|
+
require_relative 'log_factory_propagator'
|
5
|
+
require_relative 'log_factory_repository'
|
6
|
+
require_relative 'log_factory_topic'
|
7
|
+
require_relative 'log_severity'
|
8
8
|
|
9
9
|
# the module will contain all logger requirements
|
10
10
|
module RTALogger
|
@@ -36,16 +36,18 @@ module RTALogger
|
|
36
36
|
@flush_scheduler.run
|
37
37
|
end
|
38
38
|
|
39
|
-
def
|
40
|
-
config_json =
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
@default_log_level = config_json['Log_Severity'] if config_json['Log_Severity'].present?
|
45
|
-
@buffer_siz = config_json['Buffer_Size'] if config_json['Buffer_Size'].present?
|
46
|
-
@flush_wait_time = config_json['Flush_Wait_Seconds'] if config_json['Flush_Wait_Seconds'].present?
|
39
|
+
def config_use_json_file(config_file_name)
|
40
|
+
config_json = load_config_from_json_file(config_file_name)
|
41
|
+
apply_config(config_json)
|
42
|
+
rescue StandardError => e
|
43
|
+
puts e.message
|
47
44
|
@propagator.drop_all_repositories
|
48
|
-
|
45
|
+
@propagator.add_log_repository(LogFactory.new_log_repository_console)
|
46
|
+
end
|
47
|
+
|
48
|
+
def config_use_json_string(config_string)
|
49
|
+
config_json = load_config_from_json_string(config_file_name)
|
50
|
+
apply_config(config_json)
|
49
51
|
rescue StandardError => e
|
50
52
|
puts e.message
|
51
53
|
@propagator.drop_all_repositories
|
@@ -55,6 +57,7 @@ module RTALogger
|
|
55
57
|
attr_accessor :enable
|
56
58
|
attr_accessor :app_name
|
57
59
|
attr_reader :propagator
|
60
|
+
attr_reader :default_log_level
|
58
61
|
|
59
62
|
def add_topic(topic_title, log_level = @default_log_level)
|
60
63
|
@topic_semaphore.synchronize {
|
@@ -81,10 +84,21 @@ module RTALogger
|
|
81
84
|
|
82
85
|
private
|
83
86
|
|
84
|
-
def
|
87
|
+
def load_config_from_json_file(config_file_name)
|
85
88
|
config_file = File.open config_file_name
|
86
89
|
config_json = JSON.load config_file
|
87
|
-
config_json = config_json
|
90
|
+
config_json = extract_config(config_json)
|
91
|
+
config_json
|
92
|
+
end
|
93
|
+
|
94
|
+
def load_config_from_json_string(config_string)
|
95
|
+
config_json = JSON.parse(config_string)
|
96
|
+
config_json = extract_config(config_json)
|
97
|
+
config_json
|
98
|
+
end
|
99
|
+
|
100
|
+
def extract_config(json_data)
|
101
|
+
config_json = json_data['RTALogger']
|
88
102
|
raise 'RTALogger configuration not found!' unless config_json
|
89
103
|
raise 'Log_Managers section does not exists json configuration' unless config_json['Log_Managers']
|
90
104
|
raise 'No config manager defined in json configuration' unless config_json['Log_Managers'].count.positive?
|
@@ -97,6 +111,17 @@ module RTALogger
|
|
97
111
|
config_json
|
98
112
|
end
|
99
113
|
|
114
|
+
def apply_config(config_json)
|
115
|
+
raise 'json config not available' unless config_json
|
116
|
+
@enable = config_json['Enable'].nil? ? true : config_json['Enable']
|
117
|
+
@app_name = config_json['App_Name'] if config_json['App_Name'].present?
|
118
|
+
@default_log_level = config_json['Log_Severity'] if config_json['Log_Severity'].present?
|
119
|
+
@buffer_siz = config_json['Buffer_Size'] if config_json['Buffer_Size'].present?
|
120
|
+
@flush_wait_time = config_json['Flush_Wait_Seconds'] if config_json['Flush_Wait_Seconds'].present?
|
121
|
+
@propagator.drop_all_repositories
|
122
|
+
config_json['Repos']&.each { |item| @propagator.load_log_repository(item) }
|
123
|
+
end
|
124
|
+
|
100
125
|
def initialize_flush_scheduler
|
101
126
|
@flush_scheduler = Thread.new do
|
102
127
|
loop do
|
data/lib/log_propagator.rb
CHANGED
@@ -1,45 +1,44 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
@
|
9
|
-
@
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
log_repository
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
end
|
1
|
+
require_relative 'log_repository'
|
2
|
+
|
3
|
+
module RTALogger
|
4
|
+
# propagate log records to multiple log repositories
|
5
|
+
class LogPropagator
|
6
|
+
def initialize
|
7
|
+
@semaphore = Mutex.new
|
8
|
+
@log_records = []
|
9
|
+
@log_repositories = []
|
10
|
+
end
|
11
|
+
|
12
|
+
def add_log(log_record)
|
13
|
+
@semaphore.synchronize { @log_records.push(log_record.dup) }
|
14
|
+
end
|
15
|
+
|
16
|
+
def add_log_repository(log_repository)
|
17
|
+
return unless log_repository.is_a? RTALogger::LogRepository
|
18
|
+
@log_repositories.push(log_repository) unless @log_repositories.include?(log_repository)
|
19
|
+
end
|
20
|
+
|
21
|
+
def load_log_repository(config_json)
|
22
|
+
type = config_json['Type']
|
23
|
+
return if type.to_s.strip.empty?
|
24
|
+
enable = config_json['Enable'].nil? ? true : config_json['Enable']
|
25
|
+
return unless enable
|
26
|
+
|
27
|
+
log_repository = ::RTALogger::LogFactory.create_repository(type, config_json)
|
28
|
+
add_log_repository(log_repository)
|
29
|
+
end
|
30
|
+
|
31
|
+
def drop_all_repositories
|
32
|
+
@semaphore.synchronize { @log_repositories.clear }
|
33
|
+
end
|
34
|
+
|
35
|
+
def propagate
|
36
|
+
@semaphore.synchronize do
|
37
|
+
@log_repositories.each do |log_repository|
|
38
|
+
log_repository.add_log_records(@log_records)
|
39
|
+
end
|
40
|
+
@log_records.clear
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
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.topic_title
|
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.topic_title
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
data/lib/log_repository.rb
CHANGED
@@ -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,7 +7,7 @@ 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
13
|
protected
|
@@ -18,6 +18,5 @@ module RTALogger
|
|
18
18
|
end
|
19
19
|
super
|
20
20
|
end
|
21
|
-
|
22
21
|
end
|
23
22
|
end
|
data/lib/log_repository_file.rb
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
require 'logger'
|
2
2
|
require_relative 'log_repository'
|
3
|
-
require_relative '
|
4
|
-
require_relative '
|
3
|
+
require_relative 'log_factory_file_logger'
|
4
|
+
require_relative 'log_factory_log_formatter'
|
5
5
|
|
6
6
|
module RTALogger
|
7
7
|
# show log items on console out put
|
8
8
|
class LogRepositoryFile < LogRepository
|
9
|
-
def initialize(file_path = 'log.txt', period = 'daily', shift_size =
|
9
|
+
def initialize(file_path = 'log.txt', period = 'daily', shift_size = 1_048_576)
|
10
10
|
super()
|
11
11
|
@file_logger = RTALogger::LogFactory.new_file_logger(file_path, period, shift_size)
|
12
|
-
@formatter = RTALogger::LogFactory
|
12
|
+
@formatter = RTALogger::LogFactory.log_formatter_default
|
13
13
|
end
|
14
14
|
|
15
15
|
protected
|
@@ -20,6 +20,5 @@ module RTALogger
|
|
20
20
|
end
|
21
21
|
super
|
22
22
|
end
|
23
|
-
|
24
23
|
end
|
25
24
|
end
|
data/lib/log_repository_udp.rb
CHANGED
@@ -15,11 +15,10 @@ module RTALogger
|
|
15
15
|
semaphore.synchronize do
|
16
16
|
u1 = UDPSocket.new
|
17
17
|
u1.bind(@host, @port)
|
18
|
-
@log_records.each { |log_record| u1.send log_record.to_s, 0, @host, @port}
|
18
|
+
@log_records.each { |log_record| u1.send log_record.to_s, 0, @host, @port }
|
19
19
|
u1.close
|
20
20
|
end
|
21
21
|
super
|
22
22
|
end
|
23
|
-
|
24
23
|
end
|
25
24
|
end
|
data/lib/log_severity.rb
CHANGED
@@ -9,7 +9,7 @@ module RTALogger
|
|
9
9
|
WARN = 2
|
10
10
|
# A handleable error condition.
|
11
11
|
ERROR = 3
|
12
|
-
# An
|
12
|
+
# An un-handleable error that results in a program crash.
|
13
13
|
FATAL = 4
|
14
14
|
# An unknown message that should always be logged.
|
15
15
|
UNKNOWN = 5
|
data/lib/log_topic.rb
CHANGED
@@ -1,10 +1,8 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require_relative './log_severity'
|
4
|
-
require_relative 'factory/origin/log_factory_record'
|
1
|
+
require_relative 'log_severity'
|
2
|
+
require_relative 'log_factory_record'
|
5
3
|
|
6
4
|
module RTALogger
|
7
|
-
# the main class to logging data
|
5
|
+
# the main class to logging data as topic
|
8
6
|
class LogTopic
|
9
7
|
include LogSeverity
|
10
8
|
include RTALogger::LogFactory
|
@@ -0,0 +1,32 @@
|
|
1
|
+
{
|
2
|
+
"RTALogger":
|
3
|
+
{
|
4
|
+
"Default_Manager": "Develop",
|
5
|
+
"Log_Managers":
|
6
|
+
[
|
7
|
+
{
|
8
|
+
"Manager_Name": "Develop",
|
9
|
+
"Enable": true,
|
10
|
+
"App_Name": "TestApp",
|
11
|
+
"Log_Severity": 2,
|
12
|
+
"Buffer_Size": 100,
|
13
|
+
"Flush_Wait_Seconds": 15,
|
14
|
+
"Formatter" : "JSON",
|
15
|
+
"Repos":
|
16
|
+
[
|
17
|
+
{
|
18
|
+
"Enable": true,
|
19
|
+
"Type": "Console"
|
20
|
+
},
|
21
|
+
{
|
22
|
+
"Enable": false,
|
23
|
+
"Type": "File",
|
24
|
+
"File_Path": "../../log/log.txt",
|
25
|
+
"Roll_Period": "daily",
|
26
|
+
"Roll_Size": "1048576"
|
27
|
+
}
|
28
|
+
]
|
29
|
+
}
|
30
|
+
]
|
31
|
+
}
|
32
|
+
}
|
data/lib/sample.rb
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
require_relative 'log_factory_manager'
|
2
|
+
require_relative 'log_factory_repository'
|
3
|
+
|
4
|
+
controller_name = 'test_controller'
|
5
|
+
userID = 5
|
6
|
+
|
7
|
+
# create log manager instance
|
8
|
+
# this could be a global variable declared in application level
|
9
|
+
log_manager = RTALogger::LogFactory.log_manager_instance
|
10
|
+
|
11
|
+
# set log manage application name (hard code)
|
12
|
+
log_manager.app_name = 'myTestApp'
|
13
|
+
|
14
|
+
# load log manager configuration from a json config file
|
15
|
+
log_manager.config_use_json_file('rta_logger_config.json')
|
16
|
+
|
17
|
+
# add log repository to log manager
|
18
|
+
#log_manager.propagator.add_log_repository(RTALogger::LogFactory.new_log_repository_console)
|
19
|
+
|
20
|
+
# add new topic to log manager
|
21
|
+
# use this api to get a new log topic instance
|
22
|
+
# this api could be called in entry point of each service or class initialize method
|
23
|
+
topic = log_manager.add_topic(controller_name)
|
24
|
+
|
25
|
+
# add log information to log topic
|
26
|
+
topic.debug(userID, 'Controller Name=', controller_name, 'debug')
|
27
|
+
topic.info(userID, 'Controller Name=', controller_name, 'information')
|
28
|
+
topic.warning(userID, 'Controller Name=', controller_name, 'warning')
|
29
|
+
topic.error(userID, 'Controller Name=', controller_name, 'error')
|
30
|
+
topic.fatal(userID, 'Controller Name=', controller_name, 'fatal')
|
31
|
+
topic.unknown(userID, 'Controller Name=', controller_name, 'unknown')
|
32
|
+
|
33
|
+
# update specific topic log level if necessary
|
34
|
+
# log_manager.update_topic_level(controller_name, RTALogger::LogSeverity::INFO)
|
35
|
+
|
36
|
+
# update all topics log level if necessary
|
37
|
+
# log_manager.update_all_topics_log_level(RTALogger::LogSeverity::INFO)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: RTALogger
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Babak Bahreini, RTA Backend Team
|
@@ -30,6 +30,20 @@ dependencies:
|
|
30
30
|
- - ">="
|
31
31
|
- !ruby/object:Gem::Version
|
32
32
|
version: 1.11.4
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: jbuilder
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - "~>"
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '2.10'
|
40
|
+
type: :runtime
|
41
|
+
prerelease: false
|
42
|
+
version_requirements: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - "~>"
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '2.10'
|
33
47
|
description: RTA Log Manager has been designed and implemented to provide standard
|
34
48
|
logging API for developers.This prevents chaos in log data format. Also provide
|
35
49
|
multiple extendable log repositories including wrapping existing loggers, like 'Fluentd'
|
@@ -42,6 +56,12 @@ extensions: []
|
|
42
56
|
extra_rdoc_files: []
|
43
57
|
files:
|
44
58
|
- ".gitignore"
|
59
|
+
- ".idea/.gitignore"
|
60
|
+
- ".idea/.rakeTasks"
|
61
|
+
- ".idea/RTALogger.iml"
|
62
|
+
- ".idea/misc.xml"
|
63
|
+
- ".idea/modules.xml"
|
64
|
+
- ".idea/vcs.xml"
|
45
65
|
- ".rspec"
|
46
66
|
- ".travis.yml"
|
47
67
|
- Gemfile
|
@@ -54,13 +74,13 @@ files:
|
|
54
74
|
- bin/setup
|
55
75
|
- lib/RTALogger.rb
|
56
76
|
- lib/RTALogger/version.rb
|
57
|
-
- lib/
|
58
|
-
- lib/
|
59
|
-
- lib/
|
60
|
-
- lib/
|
61
|
-
- lib/
|
62
|
-
- lib/
|
63
|
-
- lib/
|
77
|
+
- lib/log_factory_file_logger.rb
|
78
|
+
- lib/log_factory_log_formatter.rb
|
79
|
+
- lib/log_factory_manager.rb
|
80
|
+
- lib/log_factory_propagator.rb
|
81
|
+
- lib/log_factory_record.rb
|
82
|
+
- lib/log_factory_repository.rb
|
83
|
+
- lib/log_factory_topic.rb
|
64
84
|
- lib/log_formatter.rb
|
65
85
|
- lib/log_formatter_json.rb
|
66
86
|
- lib/log_formatter_text.rb
|
@@ -72,9 +92,9 @@ files:
|
|
72
92
|
- lib/log_repository_file.rb
|
73
93
|
- lib/log_repository_udp.rb
|
74
94
|
- lib/log_severity.rb
|
75
|
-
- lib/log_test.rb
|
76
|
-
- lib/log_test_db.rb
|
77
95
|
- lib/log_topic.rb
|
96
|
+
- lib/rta_logger_config.json
|
97
|
+
- lib/sample.rb
|
78
98
|
homepage: https://github.com/BBahrainy/RTALogger.git
|
79
99
|
licenses:
|
80
100
|
- MIT
|
data/lib/log_test.rb
DELETED
@@ -1,41 +0,0 @@
|
|
1
|
-
#require 'logger'
|
2
|
-
#require 'date'
|
3
|
-
require_relative 'factory/origin/log_factory_manager'
|
4
|
-
require_relative 'factory/origin/log_factory_repository'
|
5
|
-
require 'socket'
|
6
|
-
|
7
|
-
controller_name = 'test_controller'
|
8
|
-
userID = 5
|
9
|
-
|
10
|
-
log_manager = RTALogger::LogFactory.log_manager_instance
|
11
|
-
log_manager.app_name = 'myTestApp'
|
12
|
-
log_manager.config('../../../config/rta_logger_config.json')
|
13
|
-
#log_manager.propagator.add_log_repository(RTALogger::LogFactory.new_log_repository_console)
|
14
|
-
#log_manager.propagator.add_log_repository(RTALogger::LogFactory.new_log_repository_file('../../../log/log.txt'))
|
15
|
-
#log_manager.propagator.add_log_repository(RTALogger::LogFactory.new_log_repository_udp('127.0.0.1', 4913))
|
16
|
-
# log_manager.propagator.add_log_repository(RTALogger::LogFactory.new_log_repository_db)
|
17
|
-
|
18
|
-
topic = log_manager.add_topic(controller_name)
|
19
|
-
|
20
|
-
topic.info(userID, 'Controller Name=', controller_name, 'Called by client 1')
|
21
|
-
|
22
|
-
#logger.level = RTALogger::LogSeverity::INFO
|
23
|
-
#manager.update_topic_level(controller_name, RTALogger::LogSeverity::INFO)
|
24
|
-
|
25
|
-
log_manager.update_all_topics_log_level(RTALogger::LogSeverity::INFO)
|
26
|
-
|
27
|
-
topic.info(userID, 'Controller Name|', controller_name, 'Called by client |2|')
|
28
|
-
topic.error(userID, 'Controller Name=', controller_name, 'Called by client 3')
|
29
|
-
|
30
|
-
#sleep(10)
|
31
|
-
|
32
|
-
topic.info(userID, 'Controller Name=', controller_name, 'Called by client |4|')
|
33
|
-
topic.fatal(userID, 'Controller Name=', controller_name, 'Called by client 5')
|
34
|
-
topic.info(userID, 'Controller Name=', controller_name, 'Called by client 6')
|
35
|
-
|
36
|
-
#ruby_logger = Logger.new(STDOUT)
|
37
|
-
#ruby_logger.formatter = proc do |severity, datetime, progname, msg|
|
38
|
-
# "NICE: #{msg}\n"
|
39
|
-
#end
|
40
|
-
#ruby_logger.info('logged by ruby default logger')
|
41
|
-
|
data/lib/log_test_db.rb
DELETED
@@ -1,59 +0,0 @@
|
|
1
|
-
#require 'active_record'
|
2
|
-
#require 'pg'
|
3
|
-
# require 'active_record' # uncomment for not Rails environment
|
4
|
-
|
5
|
-
#ActiveRecord::Base.establish_connection(:adapter => "postgresql",
|
6
|
-
# :username => "postgre",
|
7
|
-
# :database => "rails_test_development")
|
8
|
-
|
9
|
-
require 'log_record'
|
10
|
-
|
11
|
-
module RTALogger
|
12
|
-
class LogFormatter
|
13
|
-
def initialize(log_record,
|
14
|
-
delimiter = '|',
|
15
|
-
time_format = '%Y-%m-%d %H:%M:%S.%3N')
|
16
|
-
@log_record = log_record
|
17
|
-
@delimiter = delimiter
|
18
|
-
@time_format = time_format
|
19
|
-
@format_chance = format_chance
|
20
|
-
end
|
21
|
-
|
22
|
-
attr_accessor :log_record
|
23
|
-
attr_accessor :delimiter
|
24
|
-
attr_accessor :time_format
|
25
|
-
|
26
|
-
def self.default_formatter(log_record)
|
27
|
-
LogFormatter.new(log_record)
|
28
|
-
end
|
29
|
-
|
30
|
-
def to_s
|
31
|
-
result = "#{occurred_at}#{@delimiter}#{@log_record.app_name}#{@delimiter}"
|
32
|
-
result << "#{@log_record.topic_title}#{@delimiter}#{@log_record.context_id}"
|
33
|
-
result << "#{@delimiter}#{@log_record.severity}#{@delimiter}#{log_message}"
|
34
|
-
|
35
|
-
if @format_chance
|
36
|
-
result unless @format_chance.call(occurred_at,
|
37
|
-
@log_record.app_name,
|
38
|
-
@log_record.topic_title,
|
39
|
-
@log_record.context_id,
|
40
|
-
@log_record.severity,
|
41
|
-
log_message)
|
42
|
-
end
|
43
|
-
else
|
44
|
-
result
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
protected
|
49
|
-
|
50
|
-
def log_message
|
51
|
-
@log_record.message.join.gsub(delimiter, '&dlm&')
|
52
|
-
end
|
53
|
-
|
54
|
-
def occurred_at
|
55
|
-
@log_record.occurred_at.strftime(time_format)
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|