class Auth::Sanitizer::SanitizedLogger
Logger wrapper that redacts sensitive values from debug output before delegating to the underlying logger instance.
This class is intentionally narrow in scope: it only sanitizes string messages emitted through the logging path and leaves request/response behavior unchanged.
The underlying {ThingFilter} is initialized once when the logger wrapper is created, so later config changes do not alter the behavior of existing logger instances.
Attributes
The initialized thing filter used by this logger.
This is a per-logger snapshot created during initialization.
@return [ThingFilter]
Public Class Methods
Create a new sanitized logger wrapper.
@param [#add, debug, info, warn, error, fatal, unknown] logger
The underlying logger instance that will receive sanitized messages.
@param [Array<String>] filtered_keys
Key names whose values should be redacted in debug output.
Defaults to {Auth::Sanitizer.default_filtered_keys}.
@param [String] label
Replacement label for redacted values.
Defaults to {Auth::Sanitizer.filtered_label}.
# File lib/auth/sanitizer/sanitized_logger.rb 26 def initialize(logger, filtered_keys: Auth::Sanitizer.default_filtered_keys, label: Auth::Sanitizer.filtered_label) 27 @logger = logger 28 @thing_filter = ThingFilter.new(filtered_keys, label: label) 29 end
Public Instance Methods
Append a message to the underlying logger after sanitization.
@param [String] message Message to append @return [Object] The underlying logger result
# File lib/auth/sanitizer/sanitized_logger.rb 50 def <<(message) 51 @logger << sanitize(message) 52 end
Add a log entry after sanitizing any string payloads.
@param [Integer, Symbol, String, nil] severity Logger severity @param [Object, nil] message Optional log message @param [Object, nil] progname Optional program name @yieldreturn [Object] Deferred log message @return [Object] The underlying logger result
# File lib/auth/sanitizer/sanitized_logger.rb 38 def add(severity, message = nil, progname = nil) 39 if block_given? 40 @logger.add(severity, sanitize(message), sanitize(progname)) { sanitize(yield) } 41 else 42 @logger.add(severity, sanitize(message), sanitize(progname)) 43 end 44 end
Close the underlying logger if supported.
@return [void]
# File lib/auth/sanitizer/sanitized_logger.rb 111 def close 112 @logger.close if @logger.respond_to?(:close) 113 end
Log a debug message after sanitization.
@param [Object, nil] progname Optional program name @yieldreturn [Object] Deferred log message @return [Object] The underlying logger result
# File lib/auth/sanitizer/sanitized_logger.rb 59 def debug(progname = nil, &block) 60 log(:debug, progname, &block) 61 end
Log an error message after sanitization.
@param [Object, nil] progname Optional program name @yieldreturn [Object] Deferred log message @return [Object] The underlying logger result
# File lib/auth/sanitizer/sanitized_logger.rb 86 def error(progname = nil, &block) 87 log(:error, progname, &block) 88 end
Log a fatal message after sanitization.
@param [Object, nil] progname Optional program name @yieldreturn [Object] Deferred log message @return [Object] The underlying logger result
# File lib/auth/sanitizer/sanitized_logger.rb 95 def fatal(progname = nil, &block) 96 log(:fatal, progname, &block) 97 end
Access the formatter of the underlying logger if supported.
@return [Object, nil]
# File lib/auth/sanitizer/sanitized_logger.rb 118 def formatter 119 @logger.formatter if @logger.respond_to?(:formatter) 120 end
Set the formatter of the underlying logger if supported.
@param [Object] formatter Formatter object @return [void]
# File lib/auth/sanitizer/sanitized_logger.rb 126 def formatter=(formatter) 127 @logger.formatter = formatter if @logger.respond_to?(:formatter=) 128 end
Log an info message after sanitization.
@param [Object, nil] progname Optional program name @yieldreturn [Object] Deferred log message @return [Object] The underlying logger result
# File lib/auth/sanitizer/sanitized_logger.rb 68 def info(progname = nil, &block) 69 log(:info, progname, &block) 70 end
Access the logger level if supported.
@return [Object, nil]
# File lib/auth/sanitizer/sanitized_logger.rb 133 def level 134 @logger.level if @logger.respond_to?(:level) 135 end
Set the logger level if supported.
@param [Object] level Logger level @return [void]
# File lib/auth/sanitizer/sanitized_logger.rb 141 def level=(level) 142 @logger.level = level if @logger.respond_to?(:level=) 143 end
Delegate unsupported methods to the wrapped logger.
@param [Symbol] method_name Method to invoke @param [Array<Object>] args Method arguments @yield Deferred block forwarded to the wrapped logger @return [Object] The delegated result
# File lib/auth/sanitizer/sanitized_logger.rb 175 def method_missing(method_name, *args, &block) 176 return super unless @logger.respond_to?(method_name) 177 178 @logger.public_send(method_name, *args, &block) 179 end
Access the logger progname if supported.
@return [Object, nil]
# File lib/auth/sanitizer/sanitized_logger.rb 148 def progname 149 @logger.progname if @logger.respond_to?(:progname) 150 end
Set the logger progname if supported.
@param [Object] progname Logger progname @return [void]
# File lib/auth/sanitizer/sanitized_logger.rb 156 def progname=(progname) 157 @logger.progname = progname if @logger.respond_to?(:progname=) 158 end
Report support for methods provided by the wrapped logger.
@param [Symbol] method_name Method name to check @param [Boolean] include_private Whether private methods are considered @return [Boolean]
# File lib/auth/sanitizer/sanitized_logger.rb 165 def respond_to_missing?(method_name, include_private = false) 166 @logger.respond_to?(method_name, include_private) || super 167 end
Log an unknown-severity message after sanitization.
@param [Object, nil] progname Optional program name @yieldreturn [Object] Deferred log message @return [Object] The underlying logger result
# File lib/auth/sanitizer/sanitized_logger.rb 104 def unknown(progname = nil, &block) 105 log(:unknown, progname, &block) 106 end
Log a warning message after sanitization.
@param [Object, nil] progname Optional program name @yieldreturn [Object] Deferred log message @return [Object] The underlying logger result
# File lib/auth/sanitizer/sanitized_logger.rb 77 def warn(progname = nil, &block) 78 log(:warn, progname, &block) 79 end
Private Instance Methods
Dispatch a severity-specific log call after sanitization.
@param [Symbol] level Logger method name @param [Object, nil] progname Optional program name @yieldreturn [Object] Deferred log message @return [Object] The underlying logger result
# File lib/auth/sanitizer/sanitized_logger.rb 189 def log(level, progname = nil) 190 if block_given? 191 @logger.public_send(level, sanitize(progname)) { sanitize(yield) } 192 else 193 @logger.public_send(level, sanitize(progname)) 194 end 195 end
Sanitize a logger message when it is a String.
@param [Object] message Potential logger payload @return [Object] Unchanged non-String payloads, sanitized String payloads
# File lib/auth/sanitizer/sanitized_logger.rb 201 def sanitize(message) 202 return message unless message.is_a?(String) 203 204 sanitized = message.dup 205 sanitized = sanitize_authorization_header(sanitized) 206 sanitized = sanitize_json_pairs(sanitized) 207 sanitize_form_and_query_pairs(sanitized) 208 end
Redact form-encoded and query-string values for configured sensitive key names.
@param [String] message Logger message @return [String] Sanitized logger message
# File lib/auth/sanitizer/sanitized_logger.rb 239 def sanitize_form_and_query_pairs(message) 240 message.gsub(/(\b(?:#{thing_filter.pattern_source})=)([^&\s"]+)/i, "\\1#{thing_filter.label}") 241 end
Redact JSON-style values for configured sensitive key names.
@param [String] message Logger message @return [String] Sanitized logger message
# File lib/auth/sanitizer/sanitized_logger.rb 229 def sanitize_json_pairs(message) 230 message.gsub(/(["'])(#{thing_filter.pattern_source})\1(\s*:\s*)(["'])(.*?)\4/i) do 231 %(#{$1}#{$2}#{$1}#{$3}#{$4}#{thing_filter.label}#{$4}) 232 end 233 end