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

severities[R]
silencer[RW]
copy_to_stdout[RW]

Public Class Methods

new( log_path = nil ) click to toggle source

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

add( severity, message = nil, skip_caller = false ) { || ... } click to toggle source
# 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
clean_trace( trace ) click to toggle source
# 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
close() click to toggle source
# File lib/daemon_kit/abstract_logger.rb, line 166
def close
  case @backend
  when :logger
    self.logger.close
    @logger = nil
  end
end
debug( msg = nil, &block ) click to toggle source
# File lib/daemon_kit/abstract_logger.rb, line 72
def debug( msg = nil, &block )
  add( :debug, msg, &block )
end
debug?() click to toggle source
# File lib/daemon_kit/abstract_logger.rb, line 76
def debug?
  self.level == :debug
end
error( msg = nil, &block ) click to toggle source
# File lib/daemon_kit/abstract_logger.rb, line 96
def error( msg = nil, &block )
  add( :error, msg, &block )
end
error?() click to toggle source
# File lib/daemon_kit/abstract_logger.rb, line 100
def error?
  self.level == :error
end
exception( e ) click to toggle source

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
fatal( msg = nil, &block ) click to toggle source
# File lib/daemon_kit/abstract_logger.rb, line 104
def fatal( msg = nil, &block )
  add( :fatal, msg, &block )
end
fatal?() click to toggle source
# File lib/daemon_kit/abstract_logger.rb, line 108
def fatal?
  self.level == :fatal
end
info( msg = nil, &block ) click to toggle source
# File lib/daemon_kit/abstract_logger.rb, line 80
def info( msg = nil, &block )
  add( :info, msg, &block )
end
info?() click to toggle source
# File lib/daemon_kit/abstract_logger.rb, line 84
def info?
  self.level == :info
end
level() click to toggle source
# File lib/daemon_kit/abstract_logger.rb, line 136
def level
  self.class.severities.invert[ @logger.level ]
end
level=( level ) click to toggle source
# 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
logger() click to toggle source
# File lib/daemon_kit/abstract_logger.rb, line 145
def logger
  @logger ||= create_logger
end
logger=( logger ) click to toggle source
# 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( temporary_level = :error ) { |self| ... } click to toggle source

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
unknown( msg = nil, &block ) click to toggle source
# File lib/daemon_kit/abstract_logger.rb, line 112
def unknown( msg = nil, &block )
  add( :unknown, msg, &block )
end
unknown?() click to toggle source
# File lib/daemon_kit/abstract_logger.rb, line 116
def unknown?
  self.level == :unknown
end
warn( msg = nil, &block ) click to toggle source
# File lib/daemon_kit/abstract_logger.rb, line 88
def warn( msg = nil, &block )
  add( :warn, msg, &block )
end
warn?() click to toggle source
# File lib/daemon_kit/abstract_logger.rb, line 92
def warn?
  self.level == :warn
end

Private Instance Methods

called( trace ) click to toggle source
# 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
create_logger() click to toggle source
# 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
create_standard_logger() click to toggle source
# 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
create_syslog_logger() click to toggle source
# 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