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 +4 -4
- data/README.md +4 -1
- data/VERSION +1 -1
- data/lib/rails_semantic_logging/railtie.rb +17 -10
- data/lib/rails_semantic_logging/rspec/matchers.rb +43 -20
- metadata +11 -5
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 40482577c0ac8936d96cf3d500c24b645c0226a31ea751622b420d7888590eec
|
|
4
|
+
data.tar.gz: b974b492c915aa1e3b800c48a038534cb7ae46c17b8ca100fd8eaceda3f473b6
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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
|
-
|
|
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.
|
|
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
|
-
#
|
|
21
|
-
|
|
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
|
-
|
|
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.
|
|
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: '
|
|
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: '
|
|
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.
|