semantic_logger 2.18.0 → 2.19.0
Sign up to get free protection for your applications and to get access to all the features.
- 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:
|