Skip to content

Instantly share code, notes, and snippets.

@akarzim
Last active February 2, 2016 08:14
Show Gist options
  • Select an option

  • Save akarzim/378314ddc9fc08a47e5c to your computer and use it in GitHub Desktop.

Select an option

Save akarzim/378314ddc9fc08a47e5c to your computer and use it in GitHub Desktop.
Logging::Logger #with_backtrace
# https://github.com/TwP/logging/
# Temporarily log with or without backtrace
#
# Usage:
# require 'logging'
# logger = Logging.logger(STDOUT)
# logger.with_backtrace do
# logger.error StandardError.new('oups!')
# end
#
module Logging
class Logger
# force backtrace logging temporarily
def with_backtrace(&block)
self.class.send(:_backtrace_backup, self)
self.class.send(:_backtrace_on, self)
yield block
ensure
self.class.send(:_backtrace_restore, self)
end
# force no backtrace logging temporarily
def without_backtrace(&block)
self.class.send(:_backtrace_backup, self)
self.class.send(:_backtrace_off, self)
yield block
ensure
self.class.send(:_backtrace_restore, self)
end
def self._backtrace_backup(logger)
@_appenders ||= {}
logger.appenders.each_with_object(@_appenders) do |appender, accu|
accu[appender.object_id] = appender.layout.instance_variable_get(:@backtrace)
end
_backtrace_backup(logger.parent) if logger.respond_to? :parent
end
private_class_method :_backtrace_backup
def self._backtrace_restore(logger)
appenders = logger.instance_variable_get(:@appenders)
logger.appenders.clear
appenders.each do |appender|
appender.layout.instance_variable_set(:@backtrace, @_appenders[appender.object_id])
end
_backtrace_restore(logger.parent) if logger.respond_to? :parent
end
private_class_method :_backtrace_restore
def self._backtrace_off(logger)
logger.instance_variable_get(:@appenders).each do |appender|
appender.layout.instance_variable_set(:@backtrace, false)
end
_backtrace_off(logger.parent) if logger.respond_to? :parent
end
private_class_method :_backtrace_off
def self._backtrace_on(logger)
logger.instance_variable_get(:@appenders).each do |appender|
appender.layout.instance_variable_set(:@backtrace, true)
end
_backtrace_on(logger.parent) if logger.respond_to? :parent
end
private_class_method :_backtrace_on
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment