Class: Flapjack::Logger

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

Constant Summary collapse

LEVELS =
[:debug, :info, :warn, :error, :fatal]
SEVERITY_LABELS =
%w(DEBUG INFO WARN ERROR FATAL)
SYSLOG_LEVELS =
[::Syslog::Constants::LOG_DEBUG,
 ::Syslog::Constants::LOG_INFO,
 ::Syslog::Constants::LOG_WARNING,
 ::Syslog::Constants::LOG_ERR,
 ::Syslog::Constants::LOG_CRIT
]

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(name, config = {}) ⇒ Logger

Returns a new instance of Logger.



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
# File 'lib/flapjack/logger.rb', line 42

def initialize(name, config = {})
  config ||= {}

  @name = name

  @formatter = proc do |severity, datetime, progname, msg|
    t = datetime.iso8601(6)
    "#{t} [#{severity}] :: #{@name} :: #{msg}\n"
  end

  output = if config[:file].nil? || config[:file].empty? ||
    !File.exists?(File.dirname(config[:file])) ||
    !File.writable?(File.dirname(config[:file])) ||
    (File.exists?(config[:file]) && !File.writable?(config[:file]))

    STDOUT
  else
    config[:file]
  end

  @logger = ::Logger.new(output)
  @logger.formatter = @formatter

  configure(config)
end

Class Method Details

.syslog_add(severity, message, name) ⇒ Object



100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
# File 'lib/flapjack/logger.rb', line 100

def self.syslog_add(severity, message, name)
  @lock ||= Monitor.new
  @lock.synchronize do
    level = SYSLOG_LEVELS[severity]
    t = Time.now.iso8601
    l = SEVERITY_LABELS[severity]
    begin
      Syslog.open('flapjack', (Syslog::Constants::LOG_PID | Syslog::Constants::LOG_CONS),
                               Syslog::Constants::LOG_USER)
      Syslog.mask = Syslog::LOG_UPTO(::Syslog::Constants::LOG_ERR)
      Syslog.log(level, "#{t} [#{l}] :: #{name} :: %s", message)
    ensure
      Syslog.close
    end
  end
end

Instance Method Details

#add(severity, message = nil, progname = nil, &block) ⇒ Object



117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
# File 'lib/flapjack/logger.rb', line 117

def add(severity, message = nil, progname = nil, &block)
  raise "Cannot log with a closed logger" if @logger.nil?
  @logger.add(severity, message, progname, &block)
  if severity >= @level
    progname ||= 'flapjack'
    if message.nil?
      if block_given?
        message = yield
      else
        message = progname
        progname = 'flapjack'
      end
    end
  end

  Flapjack::Logger.syslog_add(severity, message, @name) if @use_syslog
end

#closeObject



94
95
96
97
98
# File 'lib/flapjack/logger.rb', line 94

def close
  raise "Already closed" if @logger.nil?
  @logger.close
  @logger = nil
end

#configure(config) ⇒ Object



68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
# File 'lib/flapjack/logger.rb', line 68

def configure(config)
  raise "Cannot configure closed logger" if @logger.nil?

  level = config['level']

  # we'll let Logger spit the dummy on invalid level values -- but will
  # assume INFO if nothing is provided
  if level.nil? || level.empty?
    level = 'INFO'
  end

  err = nil

  @level = begin
    ::Logger.const_get(level.upcase)
  rescue NameError
    err = "Unknown Logger severity level '#{level.upcase}', using INFO..."
    ::Logger::INFO
  end

  @logger.error(err) if err

  @logger.level = @level
  @use_syslog = config.has_key?('syslog_errors') && config['syslog_errors']
end

#respond_to?(sym) ⇒ Boolean

Returns:

  • (Boolean)


141
142
143
# File 'lib/flapjack/logger.rb', line 141

def respond_to?(sym)
  (LEVELS + [:configure, :close, :add]).include?(sym)
end