lorekeeper 1.7.2 → 1.11.1
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/.travis.yml +5 -9
- data/CHANGELOG.md +15 -0
- data/README.md +18 -0
- data/Rakefile +4 -4
- data/lib/lorekeeper/fast_logger.rb +7 -2
- data/lib/lorekeeper/json_logger.rb +44 -15
- data/lib/lorekeeper/version.rb +1 -1
- data/lorekeeper.gemspec +2 -1
- metadata +21 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bfcc3f33a2a846246a7e85d8c8c2730d1099bb0c41b80b86998ffd6beb5736a4
|
4
|
+
data.tar.gz: 2e7b7f4a5e80c372ca5b17b4f961efa80bbd17e67713a075064c63659767bc2f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fc4fa20700854b22f850129142a801ac56131e0f46e6f7ad74e69356821505715514c3b32041c58eaf3affa4dfe0ec951244e5e63222c26a08b115d9ecf8ea3f
|
7
|
+
data.tar.gz: 8de40794309ff297adee1865243dbc856a6b6f687cef620af6807b5a582e2011b00ab822a948e870368b01bcce9ac0c3071eba9d7b95ce8a75c8451468cc4dfa
|
data/.travis.yml
CHANGED
@@ -2,14 +2,10 @@ language: ruby
|
|
2
2
|
cache: bundler
|
3
3
|
|
4
4
|
rvm:
|
5
|
-
- 2.
|
6
|
-
- 2.
|
7
|
-
- 2.
|
8
|
-
- 2.
|
9
|
-
|
10
|
-
before_install:
|
11
|
-
- gem install rubygems-update -v 2.7.8
|
12
|
-
- gem install bundler -v 1.17.3
|
13
|
-
- bundle --version
|
5
|
+
- 2.4.9
|
6
|
+
- 2.5.8
|
7
|
+
- 2.6.6
|
8
|
+
- 2.7.2
|
9
|
+
- 3.0.0
|
14
10
|
|
15
11
|
script: bundle exec rspec
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,18 @@
|
|
1
|
+
# 1.11.1
|
2
|
+
* Modify FastLogger#add to log progname as a message if no message and block are given
|
3
|
+
|
4
|
+
# 1.11.0
|
5
|
+
* Support for activerecord-session_store v2 which calls only silence and not silence_logger
|
6
|
+
|
7
|
+
# 1.10.0
|
8
|
+
* Use ActiveSupport::BacktraceCleaner to reduce noise in stacktrace output
|
9
|
+
|
10
|
+
# 1.9.0
|
11
|
+
* Remove Newrelic instrumentation information from stacktrace output
|
12
|
+
|
13
|
+
# 1.8.0
|
14
|
+
* Allow to use named parameters in the .exception method
|
15
|
+
|
1
16
|
# 1.7.2
|
2
17
|
* Add a second parameter to respond_to? to avoid Ruby 2.6 warnings
|
3
18
|
* Drop support for unsupported Ruby 2.1 and Ruby 2.2
|
data/README.md
CHANGED
@@ -169,6 +169,24 @@ Will output:
|
|
169
169
|
}
|
170
170
|
```
|
171
171
|
|
172
|
+
Alternatively you can use named parameters:
|
173
|
+
|
174
|
+
|
175
|
+
```ruby
|
176
|
+
rescue => e
|
177
|
+
logger.exception(e, message: "custom msg!", data: { some: { data: 123 } }, level: :warn)
|
178
|
+
end
|
179
|
+
```
|
180
|
+
|
181
|
+
This is specially useful when there is no custom message or data:
|
182
|
+
|
183
|
+
```ruby
|
184
|
+
rescue => e
|
185
|
+
logger.exception(e, level: :warn)
|
186
|
+
end
|
187
|
+
```
|
188
|
+
|
189
|
+
|
172
190
|
|
173
191
|
## License
|
174
192
|
|
data/Rakefile
CHANGED
@@ -50,10 +50,10 @@ task :benchmark do
|
|
50
50
|
simple_log = create_simple_logger
|
51
51
|
|
52
52
|
Benchmark.ips do |bm|
|
53
|
-
bm.report('short content') { log.
|
54
|
-
bm.report('Logger short content') { simple_log.
|
55
|
-
bm.report('long content') { log.
|
56
|
-
bm.report('Logger long content') { simple_log.
|
53
|
+
bm.report('JSON short content') { log.debug(contents) }
|
54
|
+
bm.report('Logger short content') { simple_log.debug(contents) }
|
55
|
+
bm.report('JSON long content') { log.debug(long_contents) }
|
56
|
+
bm.report('Logger long content') { simple_log.debug(long_contents) }
|
57
57
|
bm.compare!
|
58
58
|
end
|
59
59
|
|
@@ -54,9 +54,9 @@ module Lorekeeper
|
|
54
54
|
end
|
55
55
|
|
56
56
|
# This is part of the standard Logger API, we need this to be compatible
|
57
|
-
def add(severity, message_param = nil,
|
57
|
+
def add(severity, message_param = nil, progname = nil, &block)
|
58
58
|
return true if severity < @level
|
59
|
-
message = message_param || (block && block.call)
|
59
|
+
message = message_param || (block && block.call) || progname
|
60
60
|
log_data(severity, message.freeze)
|
61
61
|
end
|
62
62
|
|
@@ -68,6 +68,11 @@ module Lorekeeper
|
|
68
68
|
yield if block_given?
|
69
69
|
end
|
70
70
|
|
71
|
+
# activerecord-session_store v2 is now simply calling silence instead of silence_logger
|
72
|
+
def silence(&block)
|
73
|
+
yield if block_given?
|
74
|
+
end
|
75
|
+
|
71
76
|
# inherited classes probably want to reimplement this
|
72
77
|
def log_data(_severity, message)
|
73
78
|
@iodevice.write(message)
|
@@ -9,6 +9,7 @@ module Lorekeeper
|
|
9
9
|
def initialize(file)
|
10
10
|
reset_state
|
11
11
|
@base_fields = { MESSAGE => '', TIMESTAMP => '', LEVEL => '' }
|
12
|
+
@backtrace_cleaner = set_backtrace_cleaner
|
12
13
|
super(file)
|
13
14
|
end
|
14
15
|
|
@@ -29,7 +30,7 @@ module Lorekeeper
|
|
29
30
|
LOGGING_METHODS.each do |method_name|
|
30
31
|
define_method "#{method_name}_with_data", ->(message_param = nil, data = {}, &block) do
|
31
32
|
return true if METHOD_SEVERITY_MAP[method_name] < @level
|
32
|
-
extra_fields = {
|
33
|
+
extra_fields = { DATA => (data || {}) }
|
33
34
|
with_extra_fields(extra_fields) { # Using do/end here only valid on Ruby>= 2.3
|
34
35
|
add(METHOD_SEVERITY_MAP[method_name], message_param, nil, &block)
|
35
36
|
}
|
@@ -61,25 +62,31 @@ module Lorekeeper
|
|
61
62
|
end
|
62
63
|
|
63
64
|
# @param exception: instance of a class inheriting from Exception
|
64
|
-
#
|
65
|
-
#
|
66
|
-
def exception(exception, custom_message = nil, custom_data = nil,
|
67
|
-
|
65
|
+
# By default message comes from exception.message
|
66
|
+
# Optional and named parameters to overwrite message, level and add data
|
67
|
+
def exception(exception, custom_message = nil, custom_data = nil, custom_level = :error,
|
68
|
+
message: nil, data: nil, level: nil) # Backwards compatible named params
|
69
|
+
|
70
|
+
param_level = level || custom_level
|
71
|
+
param_data = data || custom_data
|
72
|
+
param_message = message || custom_message
|
73
|
+
|
74
|
+
log_level = METHOD_SEVERITY_MAP[param_level] || ERROR
|
68
75
|
|
69
76
|
if exception.is_a?(Exception)
|
70
|
-
backtrace = exception.backtrace || []
|
77
|
+
backtrace = clean_backtrace(exception.backtrace || [])
|
71
78
|
exception_fields = {
|
72
|
-
|
73
|
-
|
79
|
+
EXCEPTION => "#{exception.class}: #{exception.message}",
|
80
|
+
STACK => backtrace
|
74
81
|
}
|
75
|
-
exception_fields[
|
82
|
+
exception_fields[DATA] = param_data if param_data
|
76
83
|
|
77
|
-
message =
|
84
|
+
message = param_message || exception.message
|
78
85
|
with_extra_fields(exception_fields) { log_data(log_level, message) }
|
79
86
|
else
|
80
87
|
log_data(METHOD_SEVERITY_MAP[:warn], 'Logger exception called without exception class.')
|
81
|
-
message = "#{exception.class}: #{exception.inspect} #{
|
82
|
-
with_extra_fields(
|
88
|
+
message = "#{exception.class}: #{exception.inspect} #{param_message}"
|
89
|
+
with_extra_fields(DATA => (param_data || {})) { log_data(log_level, message) }
|
83
90
|
end
|
84
91
|
end
|
85
92
|
|
@@ -89,11 +96,32 @@ module Lorekeeper
|
|
89
96
|
|
90
97
|
private
|
91
98
|
|
99
|
+
# Some instrumentation libraries pollute the stacktrace and create a large output which may
|
100
|
+
# cause problems with certain logging backends.
|
101
|
+
# Hardcording newrelic and active_support/callbacks now here.
|
102
|
+
# In the future if this list grows, we may make it configurable.
|
103
|
+
def clean_backtrace(backtrace)
|
104
|
+
@backtrace_cleaner&.clean(backtrace) || backtrace
|
105
|
+
end
|
106
|
+
|
107
|
+
def set_backtrace_cleaner
|
108
|
+
return nil unless defined?(ActiveSupport::BacktraceCleaner)
|
109
|
+
|
110
|
+
cleaner = ActiveSupport::BacktraceCleaner.new
|
111
|
+
cleaner.remove_silencers!
|
112
|
+
cleaner.add_silencer { |line| line.match?(BLACKLISTED_FINGERPRINT) }
|
113
|
+
cleaner
|
114
|
+
end
|
115
|
+
|
92
116
|
THREAD_KEY = 'lorekeeper_jsonlogger_key' # Shared by all threads but unique by thread
|
93
117
|
LEVEL = 'level'
|
94
118
|
MESSAGE = 'message'
|
95
119
|
TIMESTAMP = 'timestamp'
|
96
120
|
DATE_FORMAT = '%FT%T.%6NZ'
|
121
|
+
EXCEPTION = 'exception'
|
122
|
+
STACK = 'stack'
|
123
|
+
DATA = 'data'
|
124
|
+
BLACKLISTED_FINGERPRINT = %r{newrelic_rpm|active_support/callbacks.rb}.freeze
|
97
125
|
|
98
126
|
def with_extra_fields(fields)
|
99
127
|
state[:extra_fields] = fields
|
@@ -108,11 +136,12 @@ module Lorekeeper
|
|
108
136
|
end
|
109
137
|
|
110
138
|
def log_data(severity, message)
|
139
|
+
current_state = state # Accessing state is slow. Do it only once per call.
|
111
140
|
# merging is slow, we do not want to merge with empty hash if possible
|
112
|
-
fields_to_log = if
|
113
|
-
|
141
|
+
fields_to_log = if current_state[:extra_fields].empty?
|
142
|
+
current_state[:base_fields]
|
114
143
|
else
|
115
|
-
|
144
|
+
current_state[:base_fields].merge(current_state[:extra_fields])
|
116
145
|
end
|
117
146
|
|
118
147
|
fields_to_log[MESSAGE] = message
|
data/lib/lorekeeper/version.rb
CHANGED
data/lorekeeper.gemspec
CHANGED
@@ -20,10 +20,11 @@ Gem::Specification.new do |spec|
|
|
20
20
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
21
21
|
spec.require_paths = ['lib']
|
22
22
|
|
23
|
-
spec.required_ruby_version = '>= 2.
|
23
|
+
spec.required_ruby_version = '>= 2.4.0'
|
24
24
|
|
25
25
|
spec.add_dependency 'oj', '>= 3.4', '< 4.0'
|
26
26
|
|
27
|
+
spec.add_development_dependency 'activesupport', '>= 4.0'
|
27
28
|
spec.add_development_dependency 'bundler', '>= 1.16', '< 3.0'
|
28
29
|
spec.add_development_dependency 'rake', '~> 12.0'
|
29
30
|
spec.add_development_dependency 'rspec', '~> 3.8'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lorekeeper
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.11.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jordi Polo
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-06-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: oj
|
@@ -30,6 +30,20 @@ dependencies:
|
|
30
30
|
- - "<"
|
31
31
|
- !ruby/object:Gem::Version
|
32
32
|
version: '4.0'
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: activesupport
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - ">="
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '4.0'
|
40
|
+
type: :development
|
41
|
+
prerelease: false
|
42
|
+
version_requirements: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - ">="
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '4.0'
|
33
47
|
- !ruby/object:Gem::Dependency
|
34
48
|
name: bundler
|
35
49
|
requirement: !ruby/object:Gem::Requirement
|
@@ -191,7 +205,7 @@ homepage: https://github.com/JordiPolo/lorekeeper
|
|
191
205
|
licenses:
|
192
206
|
- MIT
|
193
207
|
metadata: {}
|
194
|
-
post_install_message:
|
208
|
+
post_install_message:
|
195
209
|
rdoc_options: []
|
196
210
|
require_paths:
|
197
211
|
- lib
|
@@ -199,15 +213,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
199
213
|
requirements:
|
200
214
|
- - ">="
|
201
215
|
- !ruby/object:Gem::Version
|
202
|
-
version: 2.
|
216
|
+
version: 2.4.0
|
203
217
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
204
218
|
requirements:
|
205
219
|
- - ">="
|
206
220
|
- !ruby/object:Gem::Version
|
207
221
|
version: '0'
|
208
222
|
requirements: []
|
209
|
-
rubygems_version: 3.
|
210
|
-
signing_key:
|
223
|
+
rubygems_version: 3.2.15
|
224
|
+
signing_key:
|
211
225
|
specification_version: 4
|
212
226
|
summary: Very fast JSON logger
|
213
227
|
test_files: []
|