rails_semantic_logging 0.2.0 → 0.3.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 45760af9983f2c22b841521dede71966f21d51b02ac68909adc334a9c59d1347
4
- data.tar.gz: d143a49b3a2044e30ac92e20d0ea85d81c4634322526e1e03480e4b9f731e0e0
3
+ metadata.gz: 40482577c0ac8936d96cf3d500c24b645c0226a31ea751622b420d7888590eec
4
+ data.tar.gz: b974b492c915aa1e3b800c48a038534cb7ae46c17b8ca100fd8eaceda3f473b6
5
5
  SHA512:
6
- metadata.gz: cd642159648180526467d511be9f232571e9f7fffcac3840c02706eb1e4f0a18143921d612d8a3cb356d04ed8b51127fa2a05d746791f3a2655eb1caa87a58a2
7
- data.tar.gz: cf2ce998170d859f106e83b9b11648d1135a5015abd4a8790c67e4ce076bfaf685f1e3622eaaddf9a7127720afbc2378d01fcb8b320672ac4a4a39e9b3536c9e
6
+ metadata.gz: b2c05a19c26a66b1f7410daf9f6b01eb6ae6927c6d1df8957b93a931b430f3ffff225380cef4af9f281c2f452d3c4808ff5ee95e7279e007a649d59e3a279f8a
7
+ data.tar.gz: 1d8d2ff66e03af18e73b6e52e1e3dcd8aac16f24e62484d3a390522e521f850dab6d51a9e8dcc68a96db4dbe971b03bad2c0398a259575c6412b04e6c7d07ddd
data/README.md CHANGED
@@ -279,7 +279,10 @@ The matcher passes a **duplicated** copy of the log event to the formatter, so a
279
279
 
280
280
  ## Puma Integration
281
281
 
282
- When using Puma in clustered mode, reopen log appenders after forking:
282
+ With `semantic_logger` >= 5 appenders are reopened automatically after forking, so no Puma
283
+ configuration is needed (opt out with `SemanticLogger.reopen_on_fork = false`).
284
+
285
+ When still on `semantic_logger` 4.x, reopen log appenders after forking in clustered mode:
283
286
 
284
287
  ```ruby
285
288
  # config/puma.rb
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.0
1
+ 0.3.1
@@ -11,25 +11,32 @@ module RailsSemanticLogging
11
11
  # This ensures our configuration is applied before the logger is set up.
12
12
  initializer 'rails_semantic_logging.configure', before: :initialize_logger do |app|
13
13
  cfg = RailsSemanticLogging.config
14
+ formatter = cfg.formatter_for(Rails.env)
14
15
 
15
- # Configure rails_semantic_logger options
16
16
  app.config.rails_semantic_logger.quiet_assets = cfg.quiet_assets
17
- app.config.rails_semantic_logger.console_logger = false
18
- app.config.rails_semantic_logger.add_file_appender = false
19
17
 
20
- # Set formatter based on environment
21
- app.config.rails_semantic_logger.format = cfg.formatter_for(Rails.env)
18
+ # Declare a single stdout appender with the configured formatter.
19
+ # IMPORTANT: Do NOT pass level: parameter. Subscriber#level defaults to :trace
20
+ # when unset, which is required by the host app's spec/support/output.rb check.
21
+ if app.config.rails_semantic_logger.respond_to?(:appenders?)
22
+ # rails_semantic_logger >= 5: declaring an appender replaces the default
23
+ # file appender and the automatic console stderr appender.
24
+ app.config.rails_semantic_logger.appenders do |appenders|
25
+ appenders.add(io: $stdout, formatter: formatter)
26
+ end
27
+ else
28
+ # rails_semantic_logger 4.x: disable the built-in appenders and add ours.
29
+ app.config.rails_semantic_logger.console_logger = false
30
+ app.config.rails_semantic_logger.add_file_appender = false
31
+ app.config.rails_semantic_logger.format = formatter
32
+ app.config.semantic_logger.add_appender(io: $stdout, formatter: formatter)
33
+ end
22
34
 
23
35
  # Merge default tags (request_id, client_ip) with app-specific custom tags
24
36
  app.config.log_tags = cfg.effective_log_tags
25
37
 
26
38
  # Set log level based on environment, respecting LOG_LEVEL env var
27
39
  app.config.log_level = cfg.log_level_for(Rails.env)
28
-
29
- # Add stdout appender with the configured formatter.
30
- # IMPORTANT: Do NOT pass level: parameter. Subscriber#level defaults to :trace
31
- # when unset, which is required by the host app's spec/support/output.rb check.
32
- app.config.semantic_logger.add_appender(io: $stdout, formatter: app.config.rails_semantic_logger.format)
33
40
  end
34
41
 
35
42
  config.to_prepare do
@@ -22,6 +22,47 @@ module RailsSemanticLogging
22
22
  end
23
23
  end
24
24
 
25
+ # Shared capture plumbing for the block matchers. Opens the logger gate to
26
+ # :trace so every event reaches the in-memory capture appender, while
27
+ # pinning the pre-existing appenders to the previously *visible* threshold
28
+ # (default_level, or an active SemanticLogger.silence override such as the
29
+ # LOG env var hook) so widening the gate does not spill every captured
30
+ # event to stdout.
31
+ module CaptureAppender
32
+ module_function
33
+
34
+ def with_capture_appender(capture)
35
+ previous_level = ::SemanticLogger.default_level
36
+ pinned = pin_live_appenders(visible_level(previous_level))
37
+ ::SemanticLogger.add_appender(appender: capture)
38
+ ::SemanticLogger.default_level = :trace
39
+ yield
40
+ ::SemanticLogger.flush
41
+ ensure
42
+ ::SemanticLogger.default_level = previous_level
43
+ pinned&.each { |appender, level| appender.level = level }
44
+ ::SemanticLogger.remove_appender(capture)
45
+ end
46
+
47
+ # Pins every live appender to +level+, returning the [appender, original_level]
48
+ # pairs needed to restore them afterwards.
49
+ def pin_live_appenders(level)
50
+ ::SemanticLogger.appenders.to_a.map do |appender|
51
+ original = appender.level
52
+ appender.level = level
53
+ [appender, original]
54
+ end
55
+ end
56
+
57
+ # The threshold actually in effect before the matcher widened the gate:
58
+ # a SemanticLogger.silence override (stored as a level index in a
59
+ # thread-local by both semantic_logger 4.x and 5.x) wins over default_level.
60
+ def visible_level(default_level)
61
+ silence_index = Thread.current[:semantic_logger_silence]
62
+ silence_index ? ::SemanticLogger::Levels::LEVELS[silence_index] : default_level
63
+ end
64
+ end
65
+
25
66
  # RSpec matcher for asserting log output from a block.
26
67
  #
27
68
  # Usage:
@@ -38,14 +79,7 @@ module RailsSemanticLogging
38
79
 
39
80
  def matches?(block)
40
81
  appender = InMemoryAppender.new
41
- SemanticLogger.add_appender(appender: appender)
42
- # Temporarily lower log level to capture all messages
43
- previous_level = SemanticLogger.default_level
44
- SemanticLogger.default_level = :trace
45
- block.call
46
- SemanticLogger.flush
47
- SemanticLogger.default_level = previous_level
48
- SemanticLogger.remove_appender(appender)
82
+ CaptureAppender.with_capture_appender(appender) { block.call }
49
83
 
50
84
  @captured_logs = appender.logs
51
85
  @captured_logs.any? { |log| matches_log?(log) }
@@ -203,21 +237,10 @@ module RailsSemanticLogging
203
237
 
204
238
  def capture_first_matching_event(block)
205
239
  capture = InMemoryAppender.new
206
- with_capture_appender(capture) { block.call }
240
+ CaptureAppender.with_capture_appender(capture) { block.call }
207
241
  capture.logs.find { |evt| message_matches?(evt.message) }
208
242
  end
209
243
 
210
- def with_capture_appender(capture)
211
- ::SemanticLogger.add_appender(appender: capture)
212
- previous_level = ::SemanticLogger.default_level
213
- ::SemanticLogger.default_level = :trace
214
- yield
215
- ::SemanticLogger.flush
216
- ensure
217
- ::SemanticLogger.default_level = previous_level
218
- ::SemanticLogger.remove_appender(capture)
219
- end
220
-
221
244
  # Matches String, Regex and any object that implements `===` (incl. RSpec
222
245
  # built-in matchers like `a_string_starting_with("...")`).
223
246
  def message_matches?(actual)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails_semantic_logging
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Fabio Napoleoni
@@ -47,16 +47,22 @@ dependencies:
47
47
  name: rails_semantic_logger
48
48
  requirement: !ruby/object:Gem::Requirement
49
49
  requirements:
50
- - - "~>"
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: '4.18'
53
+ - - "<"
51
54
  - !ruby/object:Gem::Version
52
- version: '4.0'
55
+ version: '6'
53
56
  type: :runtime
54
57
  prerelease: false
55
58
  version_requirements: !ruby/object:Gem::Requirement
56
59
  requirements:
57
- - - "~>"
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: '4.18'
63
+ - - "<"
58
64
  - !ruby/object:Gem::Version
59
- version: '4.0'
65
+ version: '6'
60
66
  description: Provides a consistent, opinionated setup for structured JSON logging
61
67
  in Rails, with specific hooks for Sidekiq, ActiveJob, and Puma, as well as Datadog-friendly
62
68
  formatters.