Skip to content

Commit 1f316d2

Browse files
committed
Consolidate structured log emission
1 parent c70861a commit 1f316d2

4 files changed

Lines changed: 43 additions & 29 deletions

File tree

app/web/security/security_logger.rb

Lines changed: 9 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,10 @@ module Web
1010
# Provides structured logging for security events to stdout
1111
module SecurityLogger
1212
class << self
13-
# Initialize logger to stdout with structured JSON output
14-
# @return [Logger]
15-
def logger
16-
Thread.current[:security_logger] ||= create_logger
17-
end
18-
19-
# Reset logger (for testing)
13+
# Reset shared logger state for tests.
2014
# @return [void]
2115
def reset_logger!
22-
Thread.current[:security_logger] = nil
16+
AppLogger.reset_logger!
2317
end
2418

2519
##
@@ -133,23 +127,18 @@ def log_cache_lifecycle(component, event, details = {})
133127

134128
private
135129

136-
def create_logger
137-
AppLogger.logger
138-
end
139-
140130
##
141131
# Log a security event
142132
# @param event_type [String] type of security event
143133
# @param data [Hash] event data
144134
def log_event(event_type, data, severity: :warn)
145-
context_data = RequestContext.current_h
146-
payload = {
147-
security_event: event_type,
148-
**context_data,
149-
**LogSanitizer.sanitize_details(data)
150-
}.to_json
151-
152-
logger.public_send(severity, payload)
135+
LogEvent.emit(
136+
level: severity,
137+
payload: {
138+
security_event: event_type,
139+
**data
140+
}
141+
)
153142
rescue StandardError => error
154143
handle_logging_error(error, event_type, data)
155144
end

app/web/telemetry/log_event.rb

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
# frozen_string_literal: true
2+
3+
module Html2rss
4+
module Web
5+
##
6+
# Shared structured log emitter for request-scoped application events.
7+
module LogEvent
8+
class << self
9+
# @param payload [Hash{Symbol=>Object}]
10+
# @param level [Symbol]
11+
# @return [void]
12+
def emit(payload:, level: :info)
13+
logger.public_send(level, build_payload(payload).to_json)
14+
end
15+
16+
private
17+
18+
# @return [Logger]
19+
def logger
20+
AppLogger.logger
21+
end
22+
23+
# @param payload [Hash{Symbol=>Object}]
24+
# @return [Hash{Symbol=>Object}]
25+
def build_payload(payload)
26+
RequestContext.current_h.merge(LogSanitizer.sanitize_details(payload))
27+
end
28+
end
29+
end
30+
end
31+
end

app/web/telemetry/observability.rb

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,18 +14,13 @@ class << self
1414
# @param level [Symbol]
1515
# @return [void]
1616
def emit(event_name:, outcome:, details: {}, level: :info)
17-
logger.public_send(level, build_payload(event_name, outcome, details).to_json)
17+
LogEvent.emit(payload: build_payload(event_name, outcome, details), level: level)
1818
rescue StandardError => error
1919
handle_emit_error(error, event_name, outcome)
2020
end
2121

2222
private
2323

24-
# @return [Logger]
25-
def logger
26-
AppLogger.logger
27-
end
28-
2924
# @param error [StandardError]
3025
# @param event_name [String]
3126
# @param outcome [String]
@@ -41,7 +36,7 @@ def handle_emit_error(error, event_name, outcome)
4136
# @return [Hash{Symbol=>Object}]
4237
def build_payload(event_name, outcome, details)
4338
context = RequestContext.current_h
44-
base_payload(event_name, outcome, context).merge(details: LogSanitizer.sanitize_details(details))
39+
base_payload(event_name, outcome, context).merge(details: details)
4540
end
4641

4742
# @param event_name [String]

spec/html2rss/web/log_sanitizer_spec.rb

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
require_relative '../../../app/web/request/request_context'
77
require_relative '../../../app/web/security/security_logger'
88
require_relative '../../../app/web/telemetry/app_logger'
9+
require_relative '../../../app/web/telemetry/log_event'
910
require_relative '../../../app/web/telemetry/log_sanitizer'
1011
require_relative '../../../app/web/telemetry/observability'
1112

@@ -29,8 +30,6 @@
2930
Html2rss::Web::AppLogger.reset_logger!
3031
Html2rss::Web::SecurityLogger.reset_logger!
3132
allow(Html2rss::Web::AppLogger).to receive(:logger).and_return(logger)
32-
allow(Html2rss::Web::SecurityLogger).to receive(:logger).and_return(logger)
33-
allow(Html2rss::Web::Observability).to receive(:logger).and_return(logger)
3433
end
3534

3635
after do

0 commit comments

Comments
 (0)