lumberjack 1.2.0 → 1.2.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 10f2db93994b2941a8684c4fd933f07fc2d0067afdcfa3798f4ba3b5cc34b354
4
- data.tar.gz: e6413b5b475b1c05ffcc17662e4f553af8e6d47d79e961a5802d0d875a413f9e
3
+ metadata.gz: afea02bfb6a11fe77b13b77958097461cc546672f0059cf4a9e5cbb81445a97d
4
+ data.tar.gz: d94096a3de319ebce142ca5264b15f62f067dd5dfeaf2a1184a886dfc6a16b80
5
5
  SHA512:
6
- metadata.gz: 809fc20f5cb8cc7d704f5a5e6878f321285953c8c79139fbd9892fa6c954b645b6bdcc0ce0e0265e18b29974fd864a96fdd735a424f57bd1224653759b139fd8
7
- data.tar.gz: c7cf6e570fe6a1cbba068905ad860c26ad375b5f413d449c8f77f84c4ad81b139585ef2917aa2328dac2b80e0a3f962895a5efb8c5b988a14605e59ccf6eafbc
6
+ metadata.gz: '09250cd1360e5b0a2fcddc4f37504020adfcdcae809edf853c9580f34b1c63a0a834fe4fccb26b6b60b1a03eca2c736deaeeedd6ef5c59ed889be2eeff4ac65e'
7
+ data.tar.gz: 0e9c83f1df927ec79d906aaaecfd0a5326217f71b23e537cd4a75232a3a7c0c1f38aee6517ceb3baac09337eeb8fdd72737cfeb31d52c000775e46e8f13c4231
@@ -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::TaggedLogger
88
+ #### Compatibility with ActiveSupport::TaggedLogging
89
89
 
90
- `Lumberjack::Logger` version 1.1.2 or greater is compatible with `ActiveSupport::TaggedLogger`. 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. However, if a tagged value has a colon or equals sign in it, it will be parsed to a name value pair.
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", "baz:2", "other") do
94
- logger.info("here") # will include tags: {"tagged" => ["foo", "other"], "bar" => "1", "baz" => "2"}
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.0
1
+ 1.2.5
@@ -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
- hash = {}
16
- references ||= Set.new
17
- obj.each do |name, value|
18
- hash[name.to_s] = call(value)
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.collect { |element| call(element) }
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
@@ -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
- severity = Severity.label_to_level(severity) unless severity.is_a?(Integer)
160
-
161
- return true unless device && severity && severity >= level
162
-
163
- time = Time.now
164
- message = message.call if message.is_a?(Proc)
165
- message = formatter.format(message)
166
- progname ||= self.progname
167
-
168
- current_tags = self.tags
169
- tags = nil unless tags.is_a?(Hash)
170
- if current_tags.empty?
171
- tags = Tags.stringify_keys(tags) unless tags.nil?
172
- else
173
- if tags.nil?
174
- tags = current_tags.dup
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 = current_tags.merge(Tags.stringify_keys(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
- end
179
- tags = Tags.expand_runtime_values(tags)
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.0
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-01-20 00:00:00.000000000 Z
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