lumberjack 1.2.0 → 1.2.5
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/CHANGELOG.md +21 -0
- data/README.md +4 -4
- data/VERSION +1 -1
- data/lib/lumberjack.rb +1 -0
- data/lib/lumberjack/formatter/structured_formatter.rb +38 -6
- data/lib/lumberjack/logger.rb +53 -23
- data/lib/lumberjack/tagged_logging.rb +29 -0
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: afea02bfb6a11fe77b13b77958097461cc546672f0059cf4a9e5cbb81445a97d
|
4
|
+
data.tar.gz: d94096a3de319ebce142ca5264b15f62f067dd5dfeaf2a1184a886dfc6a16b80
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: '09250cd1360e5b0a2fcddc4f37504020adfcdcae809edf853c9580f34b1c63a0a834fe4fccb26b6b60b1a03eca2c736deaeeedd6ef5c59ed889be2eeff4ac65e'
|
7
|
+
data.tar.gz: 0e9c83f1df927ec79d906aaaecfd0a5326217f71b23e537cd4a75232a3a7c0c1f38aee6517ceb3baac09337eeb8fdd72737cfeb31d52c000775e46e8f13c4231
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,24 @@
|
|
1
|
+
## 1.2.5
|
2
|
+
|
3
|
+
* Fix logic with recursive reference guard in StructuredFormatter so it only suppresses Enumerable references.
|
4
|
+
* Add support for bang methods (error!) for setting the log level.
|
5
|
+
|
6
|
+
## 1.2.4
|
7
|
+
|
8
|
+
* Enhance ActiveSupport::TaggedLogging support so code that Lumberjack loggers can be wrapped with a tagged logger.
|
9
|
+
|
10
|
+
## 1.2.3
|
11
|
+
|
12
|
+
* Fix structured formatter so no-recursive, duplicate references are allowed.
|
13
|
+
|
14
|
+
## 1.2.2
|
15
|
+
|
16
|
+
* Prevent infinite loops in the structured formatter where objects have backreferences to each other.
|
17
|
+
|
18
|
+
## 1.2.1
|
19
|
+
|
20
|
+
* Prevent infinite loops where logging a statement triggers the logger.
|
21
|
+
|
1
22
|
## 1.2.0
|
2
23
|
|
3
24
|
* Enable compatibility with ActiveSupport::TaggedLogger by calling `tagged_logger!` on a logger.
|
data/README.md
CHANGED
@@ -85,13 +85,13 @@ logger.info("no requests") # Will not include the `request_id` tag
|
|
85
85
|
|
86
86
|
Tag keys are always converted to strings. Tags are inherited so that message tags take precedence over block tags which take precedence over global tags.
|
87
87
|
|
88
|
-
#### Compatibility with ActiveSupport::
|
88
|
+
#### Compatibility with ActiveSupport::TaggedLogging
|
89
89
|
|
90
|
-
`Lumberjack::Logger` version 1.1.2 or greater is compatible with `ActiveSupport::
|
90
|
+
`Lumberjack::Logger` version 1.1.2 or greater is compatible with `ActiveSupport::TaggedLogging`. This is so that other code that expect to have a logger that responds to the `tagged` method will work. Any tags added with the `tagged` method will be appended to an array in the the "tagged" tag.
|
91
91
|
|
92
92
|
```ruby
|
93
|
-
logger.tagged("foo", "bar=1", "
|
94
|
-
logger.info("here") # will include tags: {"tagged" => ["foo", "
|
93
|
+
logger.tagged("foo", "bar=1", "other") do
|
94
|
+
logger.info("here") # will include tags: {"tagged" => ["foo", "bar=1", "other"]}
|
95
95
|
end
|
96
96
|
```
|
97
97
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.2.
|
1
|
+
1.2.5
|
data/lib/lumberjack.rb
CHANGED
@@ -19,6 +19,7 @@ module Lumberjack
|
|
19
19
|
require_relative "lumberjack/tags.rb"
|
20
20
|
require_relative "lumberjack/tag_formatter.rb"
|
21
21
|
require_relative "lumberjack/tagged_logger_support.rb"
|
22
|
+
require_relative "lumberjack/tagged_logging.rb"
|
22
23
|
require_relative "lumberjack/template.rb"
|
23
24
|
require_relative "lumberjack/rack.rb"
|
24
25
|
|
@@ -6,26 +6,58 @@ module Lumberjack
|
|
6
6
|
class Formatter
|
7
7
|
# Dereference arrays and hashes and recursively call formatters on each element.
|
8
8
|
class StructuredFormatter
|
9
|
+
class RecusiveReferenceError < StandardError
|
10
|
+
end
|
11
|
+
|
9
12
|
def initialize(formatter = nil)
|
10
13
|
@formatter = formatter
|
11
14
|
end
|
12
15
|
|
13
16
|
def call(obj)
|
17
|
+
call_with_references(obj, Set.new)
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def call_with_references(obj, references)
|
14
23
|
if obj.is_a?(Hash)
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
24
|
+
with_object_reference(obj, references) do
|
25
|
+
hash = {}
|
26
|
+
obj.each do |name, value|
|
27
|
+
value = call_with_references(value, references)
|
28
|
+
hash[name.to_s] = value unless value.is_a?(RecusiveReferenceError)
|
29
|
+
end
|
30
|
+
hash
|
19
31
|
end
|
20
|
-
hash
|
21
32
|
elsif obj.is_a?(Enumerable) && obj.respond_to?(:size) && obj.size != Float::INFINITY
|
22
|
-
obj
|
33
|
+
with_object_reference(obj, references) do
|
34
|
+
array = []
|
35
|
+
obj.each do |value|
|
36
|
+
value = call_with_references(value, references)
|
37
|
+
array << value unless value.is_a?(RecusiveReferenceError)
|
38
|
+
end
|
39
|
+
array
|
40
|
+
end
|
23
41
|
elsif @formatter
|
24
42
|
@formatter.format(obj)
|
25
43
|
else
|
26
44
|
obj
|
27
45
|
end
|
28
46
|
end
|
47
|
+
|
48
|
+
def with_object_reference(obj, references)
|
49
|
+
if obj.is_a?(Enumerable)
|
50
|
+
return RecusiveReferenceError.new if references.include?(obj.object_id)
|
51
|
+
references << obj.object_id
|
52
|
+
begin
|
53
|
+
yield
|
54
|
+
ensure
|
55
|
+
references.delete(obj.object_id)
|
56
|
+
end
|
57
|
+
else
|
58
|
+
yield
|
59
|
+
end
|
60
|
+
end
|
29
61
|
end
|
30
62
|
end
|
31
63
|
end
|
data/lib/lumberjack/logger.rb
CHANGED
@@ -156,32 +156,37 @@ module Lumberjack
|
|
156
156
|
# logger.add_entry(:warn, "Request took a long time")
|
157
157
|
# logger.add_entry(Logger::DEBUG){"Start processing with options #{options.inspect}"}
|
158
158
|
def add_entry(severity, message, progname = nil, tags = nil)
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
if
|
174
|
-
tags =
|
159
|
+
begin
|
160
|
+
severity = Severity.label_to_level(severity) unless severity.is_a?(Integer)
|
161
|
+
return true unless device && severity && severity >= level
|
162
|
+
|
163
|
+
return true if Thread.current[:lumberjack_logging]
|
164
|
+
Thread.current[:lumberjack_logging] = true
|
165
|
+
|
166
|
+
time = Time.now
|
167
|
+
message = message.call if message.is_a?(Proc)
|
168
|
+
message = formatter.format(message)
|
169
|
+
progname ||= self.progname
|
170
|
+
|
171
|
+
current_tags = self.tags
|
172
|
+
tags = nil unless tags.is_a?(Hash)
|
173
|
+
if current_tags.empty?
|
174
|
+
tags = Tags.stringify_keys(tags) unless tags.nil?
|
175
175
|
else
|
176
|
-
tags
|
176
|
+
if tags.nil?
|
177
|
+
tags = current_tags.dup
|
178
|
+
else
|
179
|
+
tags = current_tags.merge(Tags.stringify_keys(tags))
|
180
|
+
end
|
177
181
|
end
|
178
|
-
|
179
|
-
|
180
|
-
tags = tag_formatter.format(tags) if tag_formatter
|
181
|
-
|
182
|
-
entry = LogEntry.new(time, severity, message, progname, $$, tags)
|
183
|
-
write_to_device(entry)
|
182
|
+
tags = Tags.expand_runtime_values(tags)
|
183
|
+
tags = tag_formatter.format(tags) if tag_formatter
|
184
184
|
|
185
|
+
entry = LogEntry.new(time, severity, message, progname, $$, tags)
|
186
|
+
write_to_device(entry)
|
187
|
+
ensure
|
188
|
+
Thread.current[:lumberjack_logging] = nil
|
189
|
+
end
|
185
190
|
true
|
186
191
|
end
|
187
192
|
|
@@ -232,6 +237,11 @@ module Lumberjack
|
|
232
237
|
def fatal?
|
233
238
|
level <= FATAL
|
234
239
|
end
|
240
|
+
|
241
|
+
# Set the log level to fatal.
|
242
|
+
def fatal!
|
243
|
+
self.level = FATAL
|
244
|
+
end
|
235
245
|
|
236
246
|
# Log an +ERROR+ message. The message can be passed in either the +message+ argument or in a block.
|
237
247
|
def error(message_or_progname_or_tags = nil, progname_or_tags = nil, &block)
|
@@ -242,6 +252,11 @@ module Lumberjack
|
|
242
252
|
def error?
|
243
253
|
level <= ERROR
|
244
254
|
end
|
255
|
+
|
256
|
+
# Set the log level to error.
|
257
|
+
def error!
|
258
|
+
self.level = ERROR
|
259
|
+
end
|
245
260
|
|
246
261
|
# Log a +WARN+ message. The message can be passed in either the +message+ argument or in a block.
|
247
262
|
def warn(message_or_progname_or_tags = nil, progname_or_tags = nil, &block)
|
@@ -252,6 +267,11 @@ module Lumberjack
|
|
252
267
|
def warn?
|
253
268
|
level <= WARN
|
254
269
|
end
|
270
|
+
|
271
|
+
# Set the log level to warn.
|
272
|
+
def warn!
|
273
|
+
self.level = WARN
|
274
|
+
end
|
255
275
|
|
256
276
|
# Log an +INFO+ message. The message can be passed in either the +message+ argument or in a block.
|
257
277
|
def info(message_or_progname_or_tags = nil, progname_or_tags = nil, &block)
|
@@ -262,6 +282,11 @@ module Lumberjack
|
|
262
282
|
def info?
|
263
283
|
level <= INFO
|
264
284
|
end
|
285
|
+
|
286
|
+
# Set the log level to info.
|
287
|
+
def info!
|
288
|
+
self.level = INFO
|
289
|
+
end
|
265
290
|
|
266
291
|
# Log a +DEBUG+ message. The message can be passed in either the +message+ argument or in a block.
|
267
292
|
def debug(message_or_progname_or_tags = nil, progname_or_tags = nil, &block)
|
@@ -272,6 +297,11 @@ module Lumberjack
|
|
272
297
|
def debug?
|
273
298
|
level <= DEBUG
|
274
299
|
end
|
300
|
+
|
301
|
+
# Set the log level to debug.
|
302
|
+
def debug!
|
303
|
+
self.level = DEBUG
|
304
|
+
end
|
275
305
|
|
276
306
|
# Log a message when the severity is not known. Unknown messages will always appear in the log.
|
277
307
|
# The message can be passed in either the +message+ argument or in a block.
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Lumberjack
|
4
|
+
# Monkey patch for ActiveSupport::TaggedLogger so it doesn't blow up when
|
5
|
+
# a Lumberjack logger is trying to be wrapped. This module will be automatically
|
6
|
+
# included in ActiveSupport::TaggedLogger if activesupport is already loaded.
|
7
|
+
module TaggedLogging
|
8
|
+
class << self
|
9
|
+
def included(base)
|
10
|
+
base.singleton_class.send(:prepend, ClassMethods)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
module ClassMethods
|
15
|
+
def new(logger)
|
16
|
+
if logger.is_a?(Lumberjack::Logger)
|
17
|
+
logger = logger.tagged_logger! unless logger.respond_to?(:tagged)
|
18
|
+
logger
|
19
|
+
else
|
20
|
+
super
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
if defined?(ActiveSupport::TaggedLogging)
|
28
|
+
ActiveSupport::TaggedLogging.include(Lumberjack::TaggedLogging)
|
29
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lumberjack
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.2.
|
4
|
+
version: 1.2.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brian Durand
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-05-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|
@@ -106,6 +106,7 @@ files:
|
|
106
106
|
- lib/lumberjack/severity.rb
|
107
107
|
- lib/lumberjack/tag_formatter.rb
|
108
108
|
- lib/lumberjack/tagged_logger_support.rb
|
109
|
+
- lib/lumberjack/tagged_logging.rb
|
109
110
|
- lib/lumberjack/tags.rb
|
110
111
|
- lib/lumberjack/template.rb
|
111
112
|
- lumberjack.gemspec
|