Class: RooOnRails::Logger
- Inherits:
-
SimpleDelegator
- Object
- SimpleDelegator
- RooOnRails::Logger
- Defined in:
- lib/roo_on_rails/logger.rb
Overview
A compatible replacement for the standard Logger to provide context, similar to ‘ActiveSupport::TaggedLogging` but with key/value pairs in logfmt format.
logger = RooOnRails::Logger.new(STDOUT)
logger.with(a: 1, b: 2) { logger.info 'Stuff' }
# Logs "at=INFO msg=Stuff a=1 b=2"
logger.with(a: 1) { logger.with(b: 2) { logger.info('Stuff') } }
# Logs "at=INFO msg=Stuff a=1 b=2"
The above methods persist the context in thread local storage so it will be attached to any logs made within the scope of the block, even in called methods. However, if your context only applies to the current log then you can chain off the ‘with` method.
logger.with(a: 1, b: 2).info('Stuff')
# Logs "at=INFO msg=Stuff a=1 b=2"
logger.with(a: 1) { logger.with(b: 2).info('Stuff') }
# Logs "at=INFO msg=Stuff a=1 b=2"
Hashes, arrays and any complex object that supports ‘#to_json` will be output in escaped JSON format so that it can be parsed out of the attribute values.
Instance Method Summary collapse
-
#initialize(io = STDOUT) ⇒ Logger
constructor
A new instance of Logger.
- #set_log_level(default: :DEBUG) ⇒ Object
- #with(context = {}) ⇒ Object
Constructor Details
#initialize(io = STDOUT) ⇒ Logger
Returns a new instance of Logger.
37 38 39 40 41 42 43 |
# File 'lib/roo_on_rails/logger.rb', line 37 def initialize(io = STDOUT) @show_timestamp = io.tty? logger = _default_logger_class.new(io).tap do |l| l.formatter = method(:_formatter) end super(logger) end |
Instance Method Details
#set_log_level(default: :DEBUG) ⇒ Object
62 63 64 65 66 67 68 |
# File 'lib/roo_on_rails/logger.rb', line 62 def set_log_level(default: :DEBUG) selected_level = ::Logger::Severity.constants.detect do |log_level| log_level == log_level_setting.upcase.to_sym end self.level = ::Logger::Severity.const_get(selected_level || default.upcase) end |
#with(context = {}) ⇒ Object
45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
# File 'lib/roo_on_rails/logger.rb', line 45 def with(context = {}) return Proxy.new(self, context) unless block_given? new_context = (_context_stack.last || {}).merge(context) Thread.handle_interrupt(Exception => :never) do begin _context_stack.push(new_context) Thread.handle_interrupt(Exception => :immediate) do yield self end ensure _context_stack.pop end end nil end |