class DaemonKit::AbstractLogger
One of the key parts of succesful background processes is adequate logging. The AbstractLogger
aims to simplify logging from inside daemon processes by providing additional useful information with each log line, including calling file name and line number and support for cleanly logging exceptions.
The logger can be accessed through #DaemonKit.logger.
AbstractLogger
provides an interface that is fully compatible with the Logger class provided by Ruby's Standard Library, and is extended with some additional conveniences.
The AbstractLogger
supports different backends, by default it uses a Logger instance, but can by swapped out for a SysLogLogger logger as well.
Attributes
Public Class Methods
Optional log path, defaults to DAEMON_ROOT/log/DAEMON_ENV.log
# File lib/daemon_kit/abstract_logger.rb, line 41 def initialize( log_path = nil ) if log_path.to_s == "syslog" @backend = :syslog else @logger_file = log_path || "#{DAEMON_ROOT}/log/#{DAEMON_ENV}.log" @backend = :logger end @copy_to_stdout = false end
Public Instance Methods
# File lib/daemon_kit/abstract_logger.rb, line 126 def add( severity, message = nil, skip_caller = false, &block ) message = yield if block_given? message = "#{called(caller)}: #{message}" unless skip_caller self.logger.add( self.class.severities[ severity ] ) { message } STDOUT.puts( message ) if self.copy_to_stdout end
# File lib/daemon_kit/abstract_logger.rb, line 160 def clean_trace( trace ) trace = trace.map { |l| l.gsub(DAEMON_ROOT, '') } trace = trace.reject { |l| l =~ /gems\/daemon[\-_]kit/ } trace end
# File lib/daemon_kit/abstract_logger.rb, line 166 def close case @backend when :logger self.logger.close @logger = nil end end
# File lib/daemon_kit/abstract_logger.rb, line 72 def debug( msg = nil, &block ) add( :debug, msg, &block ) end
# File lib/daemon_kit/abstract_logger.rb, line 76 def debug? self.level == :debug end
# File lib/daemon_kit/abstract_logger.rb, line 96 def error( msg = nil, &block ) add( :error, msg, &block ) end
# File lib/daemon_kit/abstract_logger.rb, line 100 def error? self.level == :error end
Conveniently log an exception and the backtrace
# File lib/daemon_kit/abstract_logger.rb, line 121 def exception( e ) message = "EXCEPTION: #{e.message}: #{clean_trace( e.backtrace )}" self.add( :error, message, true ) end
# File lib/daemon_kit/abstract_logger.rb, line 104 def fatal( msg = nil, &block ) add( :fatal, msg, &block ) end
# File lib/daemon_kit/abstract_logger.rb, line 108 def fatal? self.level == :fatal end
# File lib/daemon_kit/abstract_logger.rb, line 80 def info( msg = nil, &block ) add( :info, msg, &block ) end
# File lib/daemon_kit/abstract_logger.rb, line 84 def info? self.level == :info end
# File lib/daemon_kit/abstract_logger.rb, line 136 def level self.class.severities.invert[ @logger.level ] end
# File lib/daemon_kit/abstract_logger.rb, line 140 def level=( level ) level = ( Symbol === level ? self.class.severities[ level ] : level ) self.logger.level = level end
# File lib/daemon_kit/abstract_logger.rb, line 145 def logger @logger ||= create_logger end
# File lib/daemon_kit/abstract_logger.rb, line 149 def logger=( logger ) if logger.is_a?( Symbol ) @backend = logger @logger.close rescue nil @logger = create_logger else @logger.close rescue nil @logger = logger end end
Silence the logger for the duration of the block.
# File lib/daemon_kit/abstract_logger.rb, line 53 def silence( temporary_level = :error ) if self.class.silencer begin old_level, self.level = self.level, temporary_level yield self ensure self.level = old_level end else yield self end end
# File lib/daemon_kit/abstract_logger.rb, line 112 def unknown( msg = nil, &block ) add( :unknown, msg, &block ) end
# File lib/daemon_kit/abstract_logger.rb, line 116 def unknown? self.level == :unknown end
# File lib/daemon_kit/abstract_logger.rb, line 88 def warn( msg = nil, &block ) add( :warn, msg, &block ) end
# File lib/daemon_kit/abstract_logger.rb, line 92 def warn? self.level == :warn end
Private Instance Methods
# File lib/daemon_kit/abstract_logger.rb, line 176 def called( trace ) l = trace.detect('unknown:0') { |l| l.index('abstract_logger.rb').nil? } file, num, _ = l.split(':') if file =~ /daemon[\-_]kit/ "[daemon-kit]" else [ File.basename(file), num ].join(':') end end
# File lib/daemon_kit/abstract_logger.rb, line 188 def create_logger case @backend when :logger create_standard_logger when :syslog create_syslog_logger end end
# File lib/daemon_kit/abstract_logger.rb, line 197 def create_standard_logger log_path = File.dirname( @logger_file ) unless File.directory?( log_path ) begin FileUtils.mkdir_p( log_path ) rescue STDERR.puts "#{log_path} not writable, using STDERR for logging" @logger_file = STDERR end end l = Logger.new( @logger_file ) l.formatter = Formatter.new l.progname = if DaemonKit.configuration DaemonKit.configuration.daemon_name else File.basename($0) end l end
# File lib/daemon_kit/abstract_logger.rb, line 218 def create_syslog_logger begin require 'syslog_logger' SyslogLogger.new( DaemonKit.configuration ? DaemonKit.configuration.daemon_name : File.basename($0) ) rescue LoadError self.logger = :logger self.error( "Couldn't load syslog_logger gem, reverting to standard logger" ) end end