class Syslogger

Constants

MAPPING
MUTEX
VERSION

Attributes

facility[R]
formatter[RW]
ident[R]
level[R]
max_octets[R]
options[R]

Public Class Methods

new(ident = $0, options = Syslog::LOG_PID | Syslog::LOG_CONS, facility = nil) click to toggle source

Initializes default options for the logger

ident

the name of your program [default=$0].

options

syslog options [default=Syslog::LOG_PID | Syslog::LOG_CONS]. Correct values are:

LOG_CONS    : writes the message on the console if an error occurs when sending the message;
LOG_NDELAY  : no delay before sending the message;
LOG_PERROR  : messages will also be written on STDERR;
LOG_PID     : adds the process number to the message (just after the program name)
facility

the syslog facility [default=nil] Correct values include:

Syslog::LOG_DAEMON
Syslog::LOG_USER
Syslog::LOG_SYSLOG
Syslog::LOG_LOCAL2
Syslog::LOG_NEWS
etc.

Usage:

logger = Syslogger.new("my_app", Syslog::LOG_PID | Syslog::LOG_CONS, Syslog::LOG_LOCAL0)
logger.level = Logger::INFO # use Logger levels
logger.warn "warning message"
logger.debug "debug message"
logger.info "my_subapp" { "Some lazily computed message" }
# File lib/syslogger.rb, line 47
def initialize(ident = $0, options = Syslog::LOG_PID | Syslog::LOG_CONS, facility = nil)
  @ident = ident
  @options = options || (Syslog::LOG_PID | Syslog::LOG_CONS)
  @facility = facility
  @level = Logger::INFO
  @formatter = proc do |severity, datetime, progname, msg|
    msg
  end
end

Public Instance Methods

<<(msg) click to toggle source

Logs a message at the Logger::INFO level.

# File lib/syslogger.rb, line 79
def <<(msg)
  add(Logger::INFO, msg)
end
add(severity, message = nil, progname = nil, &block) click to toggle source

Low level method to add a message.

severity

the level of the message. One of Logger::DEBUG, Logger::INFO, Logger::WARN, Logger::ERROR, Logger::FATAL, Logger::UNKNOWN

message

the message string. If nil, the method will call the block and use the result as the message string. If both are nil or no block is given, it will use the progname as per the behaviour of both the standard Ruby logger, and the Rails BufferedLogger.

progname

optionally, overwrite the program name that appears in the log message.

# File lib/syslogger.rb, line 89
def add(severity, message = nil, progname = nil, &block)
  if message.nil? && block.nil? && !progname.nil?
    message, progname = progname, nil
  end
  progname ||= @ident
  mask = Syslog::LOG_UPTO(MAPPING[@level])
  communication = message || block && block.call
  formatted_communication = clean(formatter.call([severity], Time.now, progname, communication))
  
  MUTEX.synchronize do
    Syslog.open(progname, @options, @facility) do |s|
      s.mask = mask
      if self.max_octets
        buffer = "#{tags_text}"
        formatted_communication.bytes do |byte|
          buffer.concat(byte)
          # if the last byte we added is potentially part of an escape, we'll go ahead and add another byte
          if buffer.bytesize >= self.max_octets && !['%'.ord,'\'.ord].include?(byte)
            s.log(MAPPING[severity],buffer)
            buffer = ""
          end
        end
        s.log(MAPPING[severity],buffer) unless buffer.empty?
      else
        s.log(MAPPING[severity],"#{tags_text}#{formatted_communication}")
      end
    end
  end
end
clear_tags!() click to toggle source
# File lib/syslogger.rb, line 159
def clear_tags!
  current_tags.clear
end
ident=(ident) click to toggle source

Sets the ident string passed along to Syslog

# File lib/syslogger.rb, line 137
def ident=(ident)
  @ident = ident
end
level=(level) click to toggle source

Sets the minimum level for messages to be written in the log.

level

one of Logger::DEBUG, Logger::INFO, Logger::WARN, Logger::ERROR, Logger::FATAL, Logger::UNKNOWN

# File lib/syslogger.rb, line 126
def level=(level)
  level = Logger.const_get(level.to_s.upcase) if level.is_a?(Symbol)

  unless level.is_a?(Fixnum)
    raise ArgumentError.new("Invalid logger level `#{level.inspect}`")
  end

  @level = level
end
max_octets=(max_octets) click to toggle source

Set the max octets of the messages written to the log

# File lib/syslogger.rb, line 120
def max_octets=(max_octets)
  @max_octets = max_octets
end
pop_tags(size = 1) click to toggle source
# File lib/syslogger.rb, line 155
def pop_tags(size = 1)
  current_tags.pop size
end
push_tags(*tags) click to toggle source
# File lib/syslogger.rb, line 149
def push_tags(*tags)
  tags.flatten.reject{ |i| i.respond_to?(:empty?) ? i.empty? : !i }.tap do |new_tags|
    current_tags.concat new_tags
  end
end
tagged(*tags) { |self| ... } click to toggle source

Tagging code borrowed from ActiveSupport gem

# File lib/syslogger.rb, line 142
def tagged(*tags)
  new_tags = push_tags(*tags)
  yield self
ensure
  pop_tags(new_tags.size)
end
write(msg) click to toggle source

Log a message at the Logger::INFO level. Useful for use with Rack::CommonLogger

# File lib/syslogger.rb, line 74
def write(msg)
  add(Logger::INFO, msg)
end

Protected Instance Methods

clean(message) click to toggle source

Borrowed from SyslogLogger.

# File lib/syslogger.rb, line 166
def clean(message)
  message = message.to_s.dup
  message.strip! # remove whitespace
  message.gsub!(/\n/, '\n') # escape newlines
  message.gsub!(/%/, '%%') # syslog(3) freaks on % (printf)
  message.gsub!(/\e\[[^m]*m/, '') # remove useless ansi color codes
  message
end