Class: Bovem::Logger

Inherits:
Logger
  • Object
show all
Defined in:
lib/bovem/logger.rb

Overview

A custom logger.

Constant Summary

LEVEL_NAMES =

List of valid logger levels.

{"DEBUG" => :cyan, "INFO" => :green, "WARN" => :yellow, "ERROR" => :red, "FATAL" => :magenta}.freeze

Instance Attribute Summary (collapse)

Class Method Summary (collapse)

Instance Method Summary (collapse)

Constructor Details

- (Logger) initialize(logdev, shift_age = 0, shift_size = 1_048_576)

Creates a new logger.

Parameters:

  • logdev (String|IO)

    The log device. This is a filename (String) or IO object (typically STDOUT, STDERR, or an open file).

  • shift_age (Fixnum) (defaults to: 0)

    Number of old log files to keep, or frequency of rotation (daily, weekly or monthly).

  • shift_size (Fixnum) (defaults to: 1_048_576)

    Maximum logfile size (only applies when shift_age is a number).

See Also:



25
26
27
28
# File 'lib/bovem/logger.rb', line 25

def initialize(logdev, shift_age = 0, shift_size = 1_048_576)
  @device = logdev
  super(logdev, shift_age, shift_size)
end

Instance Attribute Details

- (IO|String) device (readonly)

Returns The file or device to log messages to.

Returns:

  • (IO|String)

    The file or device to log messages to.



12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# File 'lib/bovem/logger.rb', line 12

class Logger < ::Logger
  attr_reader :device

  # List of valid logger levels.
  LEVEL_NAMES = {"DEBUG" => :cyan, "INFO" => :green, "WARN" => :yellow, "ERROR" => :red, "FATAL" => :magenta}.freeze

  # Creates a new logger.
  #
  # @see http://www.ruby-doc.org/stdlib-1.9.3/libdoc/logger/rdoc/Logger.html
  #
  # @param logdev [String|IO] The log device. This is a filename (String) or IO object (typically STDOUT, STDERR, or an open file).
  # @param shift_age [Fixnum]  Number of old log files to keep, or frequency of rotation (daily, weekly or monthly).
  # @param shift_size [Fixnum] Maximum logfile size (only applies when shift_age is a number).
  def initialize(logdev, shift_age = 0, shift_size = 1_048_576)
    @device = logdev
    super(logdev, shift_age, shift_size)
  end

  # Creates a new logger.
  #
  # @param file [String|IO] The log device. This is a filename (String) or IO object (typically STDOUT, STDERR, or an open file).
  # @param level [Fixnum] The minimum severity to log. See http://www.ruby-doc.org/stdlib-1.9.3/libdoc/logger/rdoc/Logger.html for valid levels.
  # @param formatter [Proc] The formatter to use for logging.
  # @return [Logger] The new logger.
  def self.create(file = nil, level: Logger::INFO, formatter: nil)
    rv = new(get_real_file(file || default_file))
    rv.level = level.to_integer
    rv.formatter = formatter || default_formatter
    rv
  rescue
    raise Bovem::Errors::InvalidLogger
  end

  # Translates a file to standard input or standard output in some special cases.
  #
  # @param file [String] The string to translate.
  # @return [String|IO] The translated file name.
  def self.get_real_file(file)
    case file
    when "STDOUT" then $stdout
    when "STDERR" then $stderr
    else file
    end
  end

  # The default file for logging.
  # @return [String|IO] The default file for logging.
  def self.default_file
    @default_file ||= $stdout
  end

  # The default formatter for logging.
  # @return [Proc] The default formatter for logging.
  def self.default_formatter
    @default_formatter ||= ::Proc.new do |severity, datetime, _, msg|
      color = LEVEL_NAMES.fetch(severity, :white)

      header = Bovem::Console.replace_markers(
        sprintf(
          "{mark=bright-#{color}}[%s T+%0.5f] %s:{/mark}", datetime.strftime("%Y/%b/%d %H:%M:%S"),
          [datetime.to_f - start_time.to_f, 0].max, severity.rjust(5)
        )
      )

      sprintf("%s %s\n", header, msg)
    end
  end

  # The log time of the first logger. This allows to show a `T+0.1234` information into the log.
  # @return [Time] The log time of the first logger.
  def self.start_time
    @start_time ||= ::Time.now
  end
end

Class Method Details

+ (Logger) create(file = nil, level: Logger::INFO, formatter: nil)

Creates a new logger.

Parameters:

  • file (String|IO) (defaults to: nil)

    The log device. This is a filename (String) or IO object (typically STDOUT, STDERR, or an open file).

  • level (Fixnum)

    The minimum severity to log. See http://www.ruby-doc.org/stdlib-1.9.3/libdoc/logger/rdoc/Logger.html for valid levels.

  • formatter (Proc)

    The formatter to use for logging.

Returns:

  • (Logger)

    The new logger.



36
37
38
39
40
41
42
43
# File 'lib/bovem/logger.rb', line 36

def self.create(file = nil, level: Logger::INFO, formatter: nil)
  rv = new(get_real_file(file || default_file))
  rv.level = level.to_integer
  rv.formatter = formatter || default_formatter
  rv
rescue
  raise Bovem::Errors::InvalidLogger
end

+ (String|IO) default_file

The default file for logging.

Returns:

  • (String|IO)

    The default file for logging.



59
60
61
# File 'lib/bovem/logger.rb', line 59

def self.default_file
  @default_file ||= $stdout
end

+ (Proc) default_formatter

The default formatter for logging.

Returns:

  • (Proc)

    The default formatter for logging.



65
66
67
68
69
70
71
72
73
74
75
76
77
78
# File 'lib/bovem/logger.rb', line 65

def self.default_formatter
  @default_formatter ||= ::Proc.new do |severity, datetime, _, msg|
    color = LEVEL_NAMES.fetch(severity, :white)

    header = Bovem::Console.replace_markers(
      sprintf(
        "{mark=bright-#{color}}[%s T+%0.5f] %s:{/mark}", datetime.strftime("%Y/%b/%d %H:%M:%S"),
        [datetime.to_f - start_time.to_f, 0].max, severity.rjust(5)
      )
    )

    sprintf("%s %s\n", header, msg)
  end
end

+ (String|IO) get_real_file(file)

Translates a file to standard input or standard output in some special cases.

Parameters:

  • file (String)

    The string to translate.

Returns:

  • (String|IO)

    The translated file name.



49
50
51
52
53
54
55
# File 'lib/bovem/logger.rb', line 49

def self.get_real_file(file)
  case file
  when "STDOUT" then $stdout
  when "STDERR" then $stderr
  else file
  end
end

+ (Time) start_time

The log time of the first logger. This allows to show a T+0.1234 information into the log.

Returns:

  • (Time)

    The log time of the first logger.



82
83
84
# File 'lib/bovem/logger.rb', line 82

def self.start_time
  @start_time ||= ::Time.now
end