class OFlow::Actors::Log

An asynchronous logger build on top of the Actor class. It is able to log messages as well as forward calls to a Task.

Constants

SEVERITY_MAP

Public Class Methods

new(task, options={}) click to toggle source
Calls superclass method OFlow::Actor::new
# File lib/oflow/actors/log.rb, line 23
def initialize(task, options={})
  @logger = nil
  @formatter = nil
  @name = nil
  super
  set_options(options)
end

Public Instance Methods

formatter() click to toggle source

Returns the current formatter. @return [Logger::Formatter] current formatter

# File lib/oflow/actors/log.rb, line 40
def formatter()
  @formatter
end
level()
Alias for: severity
perform(op, box) click to toggle source

Writes a log entry. op is the severity. The box contents is expected to be an Array with the first element as the full task name of the logging task and the second argument being the message to log

# File lib/oflow/actors/log.rb, line 47
def perform(op, box)
  op = op.to_sym unless op.nil?
  a = box.contents
  case op
  when :severity
    self.severity = a
  when :formatter
    # TBD
  when :file, :filename
    # TBD
    # self.set_filename(filename, shift_age=7, shift_size=1048576)
  else
    level = SEVERITY_MAP.fetch(op, Logger::Severity::UNKNOWN)
    if a.is_a?(Array)
      log(level, a[0], a[1])
    else
      log(level, a.to_s, '')
    end
    # Forward to the next if there is a generic (nil) link.
    task.ship(nil, box) if task.find_link(nil)
  end
end
severity() click to toggle source

Returns the current severity level. @return [Fixnum] Logger severity level

# File lib/oflow/actors/log.rb, line 33
def severity()
  @logger.level
end
Also aliased as: level

Private Instance Methods

formatter=(proc) click to toggle source

Sets the formatter procedure of the logger. This method is executed asynchronously. @param proc [Proc] value to set the formatter to

# File lib/oflow/actors/log.rb, line 175
def formatter=(proc)
  @formatter = proc
end
log(level, message, tid) click to toggle source

Writes a message if the severity is high enough. This method is executed asynchronously. @param level [Fixnum] one of the Logger levels @param message [String] string to log @param tid [Fixnum|String] Task id of the Task generating the message

# File lib/oflow/actors/log.rb, line 102
def log(level, message, tid)
  now = Time.now
  ss = ['DEBUG', 'INFO', 'WARN', 'ERROR', 'FATAL'][level]
  ss = '' if ss.nil?
  if @formatter.nil?
    msg = "#{ss[0]} #{now.strftime('%Y-%m-%dT%H:%M:%S.%6N')} #{tid}> #{message}\n"
  else
    msg = @formatter.call(ss, now, tid, message)
  end
  @logger.add(level, msg)
end
logger=(logger) click to toggle source

Replace the logger with a new Logger Object. This method is executed asynchronously. @param logger [Logger] replacement logger

# File lib/oflow/actors/log.rb, line 139
def logger=(logger)
  @logger = logger
end
set_filename(filename, shift_age=7, shift_size=1048576) click to toggle source

Creates a new Logger to write log messages to using the parameters specified. This method is executed asynchronously. @param filename [String] filename of active log file @param shift_age [Fixmun] maximum number of archive files to save @param shift_size [Fixmun] maximum file size

# File lib/oflow/actors/log.rb, line 129
def set_filename(filename, shift_age=7, shift_size=1048576)
  logger = Logger.new(filename, shift_age, shift_size)
  logger.level = @logger.level
  logger.formatter = @logger.formatter
  @logger = logger
end
set_options(options) click to toggle source

Sets the logger, severity, and formatter if provided. @param [Hash] options options to be used for initialization @option options [String] :filename filename to write to @option options [Fixnum] :max_file_size maximum file size @option options [Fixnum] :max_file_count maximum number of log file @option options [IO] :stream IO stream @option options [String|Fixnum] :severity initial setting for severity @option options [Proc] :formatter initial setting for the formatter procedure

# File lib/oflow/actors/log.rb, line 80
def set_options(options)
  @formatter = options.fetch(:formatter, nil)
  if !(filename = options[:filename]).nil?
    max_file_size = options.fetch(:max_file_size, options.fetch(:shift_size, 1048576))
    max_file_count = options.fetch(:max_file_count, options.fetch(:shift_age, 7))
    @logger = Logger.new(filename, max_file_count, max_file_size)
  elsif !(stream = options[:stream]).nil?
    @logger = Logger.new(stream)
  else
    @logger = Logger.new(STDOUT)
    @formatter = proc { |s,t,p,m| "#{s[0]} #{p}> #{m}\n" } if @formatter.nil?
  end
  @logger.level = options.fetch(:severity, Env.log_level)
  @logger.formatter = proc { |s,t,p,m| m }
  @name = 'Logger' if @name.nil?
end
severity=(level) click to toggle source

Sets the severity level of the logger. This method is executed asynchronously. @param level [String|Fixnum] value to set the severity to

# File lib/oflow/actors/log.rb, line 146
def severity=(level)
  if level.is_a?(String)
    sev = {
      'FATAL' => Logger::Severity::FATAL,
      'ERROR' => Logger::Severity::ERROR,
      'WARN' => Logger::Severity::WARN,
      'INFO' => Logger::Severity::INFO,
      'DEBUG' => Logger::Severity::DEBUG,
      '4' => Logger::Severity::FATAL,
      '3' => Logger::Severity::ERROR,
      '2' => Logger::Severity::WARN,
      '1' => Logger::Severity::INFO,
      '0' => Logger::Severity::DEBUG
    }[level.upcase()]
    raise "#{level} is not a severity" if sev.nil?
    level = sev
  elsif level.is_a?(Symbol)
    sev = SEVERITY_MAP[level]
    raise "#{level} is not a severity" if sev.nil?
    level = sev
  elsif !level.is_a?(Fixnum) || level < Logger::Severity::DEBUG || Logger::Severity::FATAL < level
    raise "#{level} is not a severity"
  end
  @logger.level = level
end
stream=(stream) click to toggle source

Sets the logger to use the stream specified. This method is executed asynchronously. @param [IO] stream stream to write log messages to

# File lib/oflow/actors/log.rb, line 117
def stream=(stream)
  logger = Logger.new(stream)
  logger.level = @logger.level
  logger.formatter = @logger.formatter
  @logger = logger
end