semantic_logger 2.18.0 → 2.19.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/README.md +1 -1
- data/lib/semantic_logger/appender/base.rb +5 -8
- data/lib/semantic_logger/base.rb +1 -2
- data/lib/semantic_logger/log.rb +10 -0
- data/lib/semantic_logger/loggable.rb +2 -5
- data/lib/semantic_logger/logger.rb +5 -20
- data/lib/semantic_logger/semantic_logger.rb +3 -7
- data/lib/semantic_logger/version.rb +1 -1
- data/test/loggable_test.rb +60 -29
- data/test/logger_test.rb +16 -1
- metadata +5 -19
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8edd7638dee098976eeee0f818ea64c213da2a1f
|
4
|
+
data.tar.gz: a03fac478e80e0784e765a7c2f28c8c6b929b94b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9f85f11748ef85c23dbd912fa5a690d57cd50af051edaeb37014ba30ef987e9f22866b0632f457327c78f6243e88b242c2fe3cc4c46135b8b2f64c298de9961e
|
7
|
+
data.tar.gz: 1b5ac351139f57b94743022465f86030a8959df41e696fdcb048b4f3f07adfa1736bc21d9f4de74c6b8e0434a5d32ee44c79b7c26df4272a0201a78da8bb017a
|
data/README.md
CHANGED
@@ -11,7 +11,7 @@ Low latency, high throughput, enterprise-scale logging system for Ruby
|
|
11
11
|
|
12
12
|
[Reference Documentation](http://www.rubydoc.info/gems/semantic_logger/)
|
13
13
|
|
14
|
-
##
|
14
|
+
## Logging Destinations
|
15
15
|
|
16
16
|
Logging to the following destinations are all supported "out-of-the-box":
|
17
17
|
|
@@ -59,8 +59,8 @@ module SemanticLogger
|
|
59
59
|
entry << " -- #{log.message}" if log.message
|
60
60
|
|
61
61
|
# Payload
|
62
|
-
|
63
|
-
entry << ' -- ' <<
|
62
|
+
if payload = log.payload_to_s(false)
|
63
|
+
entry << ' -- ' << payload
|
64
64
|
end
|
65
65
|
|
66
66
|
# Exceptions
|
@@ -83,7 +83,7 @@ module SemanticLogger
|
|
83
83
|
level_color = colors::LEVEL_MAP[log.level]
|
84
84
|
|
85
85
|
# Header with date, time, log level and process info
|
86
|
-
entry
|
86
|
+
entry = "#{log.formatted_time} #{level_color}#{log.level_to_s}#{colors::CLEAR} [#{log.process_info}]"
|
87
87
|
|
88
88
|
# Tags
|
89
89
|
entry << ' ' << log.tags.collect { |tag| "[#{level_color}#{tag}#{colors::CLEAR}]" }.join(' ') if log.tags && (log.tags.size > 0)
|
@@ -98,9 +98,7 @@ module SemanticLogger
|
|
98
98
|
entry << " -- #{log.message}" if log.message
|
99
99
|
|
100
100
|
# Payload
|
101
|
-
|
102
|
-
payload = log.payload
|
103
|
-
payload = (defined?(AwesomePrint) && payload.respond_to?(:ai)) ? payload.ai(multiline: false) : payload.inspect
|
101
|
+
if payload = log.payload_to_s(true)
|
104
102
|
entry << ' -- ' << payload
|
105
103
|
end
|
106
104
|
|
@@ -123,8 +121,7 @@ module SemanticLogger
|
|
123
121
|
@level || :trace
|
124
122
|
end
|
125
123
|
|
126
|
-
|
127
|
-
protected
|
124
|
+
private
|
128
125
|
|
129
126
|
# Initializer for Abstract Class SemanticLogger::Appender
|
130
127
|
#
|
data/lib/semantic_logger/base.rb
CHANGED
data/lib/semantic_logger/log.rb
CHANGED
@@ -124,6 +124,16 @@ module SemanticLogger
|
|
124
124
|
message.to_s.gsub(/(\e(\[([\d;]*[mz]?))?)?/, '').strip
|
125
125
|
end
|
126
126
|
|
127
|
+
# Return the payload in text form
|
128
|
+
# Returns nil if payload is missing or empty
|
129
|
+
def payload_to_s(colorized = false)
|
130
|
+
return if payload.nil? || (payload.respond_to?(:empty?) && payload.empty?)
|
131
|
+
return payload.inspect if !colorized || !defined?(AwesomePrint) || !payload.respond_to?(:ai)
|
132
|
+
|
133
|
+
# Colorize the payload if the AwesomePrint gem is loaded
|
134
|
+
payload.ai(multiline: false) rescue payload.inspect
|
135
|
+
end
|
136
|
+
|
127
137
|
if defined? JRuby
|
128
138
|
# Return the Time as a formatted string
|
129
139
|
# JRuby only supports time in ms
|
@@ -1,5 +1,3 @@
|
|
1
|
-
require 'sync_attr'
|
2
|
-
|
3
1
|
# Logger class variable mix-in
|
4
2
|
#
|
5
3
|
# Lazy initialize a logger class variable with instance accessor
|
@@ -31,9 +29,8 @@ module SemanticLogger
|
|
31
29
|
|
32
30
|
def self.included(base)
|
33
31
|
base.class_eval do
|
34
|
-
|
35
|
-
|
36
|
-
SemanticLogger[self]
|
32
|
+
def self.logger
|
33
|
+
@semantic_logger ||= SemanticLogger[self]
|
37
34
|
end
|
38
35
|
end
|
39
36
|
end
|
@@ -1,22 +1,8 @@
|
|
1
|
-
require '
|
2
|
-
|
3
|
-
# Logger stores the class name to be used for all log messages so that every
|
4
|
-
# log message written by this instance will include the class name
|
1
|
+
require 'concurrent'
|
5
2
|
module SemanticLogger
|
3
|
+
# Logger stores the class name to be used for all log messages so that every
|
4
|
+
# log message written by this instance will include the class name
|
6
5
|
class Logger < Base
|
7
|
-
|
8
|
-
# DO NOT USE. Adding unused formatter to support Rails 4 logging
|
9
|
-
# Formatters must be set at the appender level, not at the logger level
|
10
|
-
#
|
11
|
-
# Due to the following code in Rails::Server#start that cannot be changed
|
12
|
-
# without patching the entire method
|
13
|
-
# console = ActiveSupport::Logger.new($stdout)
|
14
|
-
# console.formatter = Rails.logger.formatter
|
15
|
-
# console.level = Rails.logger.level
|
16
|
-
#
|
17
|
-
# Rails.logger.extend(ActiveSupport::Logger.broadcast(console))
|
18
|
-
attr_accessor :formatter
|
19
|
-
|
20
6
|
# Returns a Logger instance
|
21
7
|
#
|
22
8
|
# Return the logger for a specific class, supports class specific log levels
|
@@ -120,11 +106,10 @@ module SemanticLogger
|
|
120
106
|
# puts "#{log_struct.metric} was received. Log Struct: #{log_struct.inspect}"
|
121
107
|
# end
|
122
108
|
def self.on_metric(&block)
|
123
|
-
(@@metric_subscribers ||=
|
109
|
+
(@@metric_subscribers ||= Concurrent::Array.new) << block
|
124
110
|
end
|
125
111
|
|
126
|
-
|
127
|
-
protected
|
112
|
+
private
|
128
113
|
|
129
114
|
@@appender_thread = nil
|
130
115
|
@@queue = Queue.new
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require '
|
1
|
+
require 'concurrent'
|
2
2
|
module SemanticLogger
|
3
3
|
# Logging levels in order of most detailed to most severe
|
4
4
|
LEVELS = [:trace, :debug, :info, :warn, :error, :fatal]
|
@@ -246,14 +246,10 @@ module SemanticLogger
|
|
246
246
|
true
|
247
247
|
end
|
248
248
|
|
249
|
-
############################################################################
|
250
|
-
protected
|
251
|
-
|
252
|
-
@@appenders = ThreadSafe::Array.new
|
253
|
-
|
254
|
-
############################################################################
|
255
249
|
private
|
256
250
|
|
251
|
+
@@appenders = Concurrent::Array.new
|
252
|
+
|
257
253
|
def self.default_level_index
|
258
254
|
Thread.current[:semantic_logger_silence] || @@default_level_index
|
259
255
|
end
|
data/test/loggable_test.rb
CHANGED
@@ -8,42 +8,73 @@ end
|
|
8
8
|
# Unit Test for SemanticLogger::Appender::File
|
9
9
|
#
|
10
10
|
class AppenderFileTest < Minitest::Test
|
11
|
+
class Base
|
12
|
+
include SemanticLogger::Loggable
|
13
|
+
end
|
14
|
+
|
15
|
+
class Subclass < Base
|
16
|
+
end
|
17
|
+
|
11
18
|
describe SemanticLogger::Loggable do
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
@thread_name = Thread.current.name
|
22
|
-
end
|
19
|
+
describe 'inheritance' do
|
20
|
+
it 'should give child classes their own logger' do
|
21
|
+
assert_equal Subclass.name, Subclass.logger.name
|
22
|
+
assert_equal Base.name, Base.logger.name
|
23
|
+
assert_equal Subclass.name, Subclass.logger.name
|
24
|
+
child_logger = Subclass.logger
|
25
|
+
refute_equal child_logger, Base.logger
|
26
|
+
assert_equal child_logger.object_id, Subclass.logger.object_id
|
27
|
+
end
|
23
28
|
|
24
|
-
|
25
|
-
|
29
|
+
it 'should give child objects their own logger' do
|
30
|
+
subclass = Subclass.new
|
31
|
+
base = Base.new
|
32
|
+
assert_equal subclass.class.name, subclass.logger.name
|
33
|
+
assert_equal base.class.name, base.logger.name
|
34
|
+
assert_equal subclass.class.name, subclass.logger.name
|
35
|
+
child_logger = subclass.logger
|
36
|
+
refute_equal child_logger, base.logger
|
37
|
+
assert_equal child_logger.object_id, subclass.logger.object_id
|
38
|
+
end
|
26
39
|
end
|
27
40
|
|
28
|
-
describe '
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
41
|
+
describe 'logger' do
|
42
|
+
before do
|
43
|
+
@time = Time.new
|
44
|
+
@io = StringIO.new
|
45
|
+
@appender = SemanticLogger::Appender::File.new(@io)
|
46
|
+
SemanticLogger.default_level = :trace
|
47
|
+
@mock_logger = MockLogger.new
|
48
|
+
@appender = SemanticLogger.add_appender(@mock_logger)
|
49
|
+
@hash = {session_id: 'HSSKLEU@JDK767', tracking_number: 12345}
|
50
|
+
@hash_str = @hash.inspect.sub("{", "\\{").sub("}", "\\}")
|
51
|
+
@thread_name = Thread.current.name
|
52
|
+
end
|
53
|
+
|
54
|
+
after do
|
55
|
+
SemanticLogger.remove_appender(@appender)
|
56
|
+
end
|
57
|
+
|
58
|
+
describe 'for each log level' do
|
59
|
+
# Ensure that any log level can be logged
|
60
|
+
SemanticLogger::LEVELS.each do |level|
|
61
|
+
it "log #{level} information with class attribute" do
|
62
|
+
SemanticLogger.stub(:backtrace_level_index, 0) do
|
63
|
+
SemanticLogger.stub(:appenders, [@appender]) do
|
64
|
+
TestAttribute.logger.send(level, "hello #{level}", @hash)
|
65
|
+
SemanticLogger.flush
|
66
|
+
assert_match /\d+-\d+-\d+ \d+:\d+:\d+.\d+ \w \[\d+:#{@thread_name} loggable_test.rb:\d+\] TestAttribute -- hello #{level} -- #{@hash_str}/, @mock_logger.message
|
67
|
+
end
|
37
68
|
end
|
38
69
|
end
|
39
|
-
end
|
40
70
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
71
|
+
it "log #{level} information with instance attribute" do
|
72
|
+
SemanticLogger.stub(:backtrace_level_index, 0) do
|
73
|
+
SemanticLogger.stub(:appenders, [@appender]) do
|
74
|
+
TestAttribute.new.logger.send(level, "hello #{level}", @hash)
|
75
|
+
SemanticLogger.flush
|
76
|
+
assert_match /\d+-\d+-\d+ \d+:\d+:\d+.\d+ \w \[\d+:#{@thread_name} loggable_test.rb:\d+\] TestAttribute -- hello #{level} -- #{@hash_str}/, @mock_logger.message
|
77
|
+
end
|
47
78
|
end
|
48
79
|
end
|
49
80
|
end
|
data/test/logger_test.rb
CHANGED
@@ -97,7 +97,7 @@ class LoggerTest < Minitest::Test
|
|
97
97
|
end
|
98
98
|
end
|
99
99
|
|
100
|
-
it '
|
100
|
+
it 'logs tagged payload' do
|
101
101
|
hash = {tracking_number: "123456", even: 2, more: "data"}
|
102
102
|
hash_str = hash.inspect.sub("{", "\\{").sub("}", "\\}")
|
103
103
|
@logger.with_payload(tracking_number: '123456') do
|
@@ -108,6 +108,21 @@ class LoggerTest < Minitest::Test
|
|
108
108
|
end
|
109
109
|
end
|
110
110
|
end
|
111
|
+
|
112
|
+
it 'logs payload' do
|
113
|
+
hash = {tracking_number: "123456", even: 2, more: "data"}
|
114
|
+
hash_str = hash.inspect.sub("{", "\\{").sub("}", "\\}")
|
115
|
+
@logger.info('Hello world', hash)
|
116
|
+
SemanticLogger.flush
|
117
|
+
assert_match /\d+-\d+-\d+ \d+:\d+:\d+.\d+ I \[\d+:#{@thread_name}\] LoggerTest -- Hello world -- #{hash_str}/, @mock_logger.message
|
118
|
+
end
|
119
|
+
|
120
|
+
it 'does not log an empty payload' do
|
121
|
+
hash = {}
|
122
|
+
@logger.info('Hello world', hash)
|
123
|
+
SemanticLogger.flush
|
124
|
+
assert_match /\d+-\d+-\d+ \d+:\d+:\d+.\d+ I \[\d+:#{@thread_name}\] LoggerTest -- Hello world/, @mock_logger.message
|
125
|
+
end
|
111
126
|
end
|
112
127
|
|
113
128
|
describe 'Ruby Logger' do
|
metadata
CHANGED
@@ -1,43 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: semantic_logger
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.19.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Reid Morrison
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-12-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: concurrent-ruby
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '1.0'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: thread_safe
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - "~>"
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '0.1'
|
34
|
-
type: :runtime
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - "~>"
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: '0.1'
|
26
|
+
version: '1.0'
|
41
27
|
description: Next generation logging system for Ruby to support highly concurrent,
|
42
28
|
high throughput, low latency enterprise systems
|
43
29
|
email:
|