Class: Madvertise::Logging::ImprovedLogger

Inherits:
ImprovedIO
  • Object
show all
Defined in:
lib/madvertise/logging/improved_logger.rb,
lib/madvertise/logging/airbrake.rb

Overview

ImprovedLogger is an enhanced version of DaemonKits AbstractLogger class with token support, buffer backend and more.

Defined Under Namespace

Classes: Formatter

Class Attribute Summary collapse

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods inherited from ImprovedIO

#external_encoding, #flush, #internal_encoding, #print, #printf, #putc, #puts, #readbyte, #readchar, #readline, #set_encoding, #tty?

Constructor Details

#initialize(backend = STDERR, progname = nil) ⇒ ImprovedLogger

Returns a new instance of ImprovedLogger.



59
60
61
62
63
# File 'lib/madvertise/logging/improved_logger.rb', line 59

def initialize(backend = STDERR, progname = nil)
  self.progname = progname || File.basename($0)
  self.logger = backend
  self.log_caller = false
end

Class Attribute Details

.severitiesObject (readonly)

Hash of Symbol/Fixnum pairs to map Logger levels.



52
53
54
# File 'lib/madvertise/logging/improved_logger.rb', line 52

def severities
  @severities
end

.silencerObject

Enable/disable the silencer on a global basis. Useful for debugging otherwise silenced code blocks.



56
57
58
# File 'lib/madvertise/logging/improved_logger.rb', line 56

def silencer
  @silencer
end

Instance Attribute Details

#log_callerObject

Log the file/line where the message came from



34
35
36
# File 'lib/madvertise/logging/improved_logger.rb', line 34

def log_caller
  @log_caller
end

#logfileObject (readonly)

Log filename for file backend.



37
38
39
# File 'lib/madvertise/logging/improved_logger.rb', line 37

def logfile
  @logfile
end

#prognameObject

Program name prefix. Used as ident for syslog backends.



28
29
30
# File 'lib/madvertise/logging/improved_logger.rb', line 28

def progname
  @progname
end

#tokenObject

Arbitrary token to prefix log messages with.



31
32
33
# File 'lib/madvertise/logging/improved_logger.rb', line 31

def token
  @token
end

Instance Method Details

#add(severity, message, attribs = {}) ⇒ Object



180
181
182
183
184
185
186
187
188
189
190
191
192
193
# File 'lib/madvertise/logging/improved_logger.rb', line 180

def add(severity, message, attribs = {})
  severity = severity.is_a?(Symbol) ? severity : self.class.severities.key(severity)

  attribs.merge!(called_from) if @log_caller
  attribs.merge!(token: @token) if @token
  attribs = attribs.map do |k,v|
    "#{k}=#{v.to_s.clean_quote}"
  end.join(' ')

  message = "#{message} #{attribs}" if attribs.length > 0
  logger.send(severity) { message }

  return nil
end

#bufferString

Retrieve the current buffer in case this instance is a buffered logger.

Returns:

  • (String)

    Contents of the buffer.



94
95
96
# File 'lib/madvertise/logging/improved_logger.rb', line 94

def buffer
  @logfile.string if @backend == :buffer
end

#closeObject

Close any connections/descriptors that may have been opened by the current backend.



86
87
88
89
# File 'lib/madvertise/logging/improved_logger.rb', line 86

def close
  @logger.close rescue nil
  @logger = nil
end

#exception_with_airbrake(exc, message = nil, attribs = {}) ⇒ Object Also known as: exception

Log an exception with airbrake.

Parameters:

  • exc (Exception)

    The exception to log.

  • message (String) (defaults to: nil)

    Additional reason to log.



10
11
12
13
14
15
# File 'lib/madvertise/logging/airbrake.rb', line 10

def exception_with_airbrake(exc, message = nil, attribs = {})
  Airbrake.notify_or_ignore(exc, {
    :error_message => message,
    :cgi_data => ENV.to_hash,
  }.merge(attribs))
end

#exception_without_airbrakeObject



17
# File 'lib/madvertise/logging/airbrake.rb', line 17

alias_method :exception_without_airbrake, :exception

#levelSymbol

Get the current logging level.

Returns:

  • (Symbol)

    Current logging level.



108
109
110
# File 'lib/madvertise/logging/improved_logger.rb', line 108

def level
  logger.level
end

#level=(level) ⇒ Fixnum

Set the logging level.

Parameters:

  • level (Symbol, Fixnum)

    New level as Symbol or Fixnum from Logger class.

Returns:

  • (Fixnum)

    New level converted to Fixnum from Logger class.



116
117
118
119
120
# File 'lib/madvertise/logging/improved_logger.rb', line 116

def level=(level)
  logger.level = level.is_a?(Symbol) ? self.class.severities[level] : level
  configure_log4j(logger)
  define_level_methods
end

#loggerLogger

Get the backend logger.

Returns:

  • (Logger)

    The currently active backend logger object.



68
69
70
# File 'lib/madvertise/logging/improved_logger.rb', line 68

def logger
  @logger ||= create_backend
end

#logger=(value) ⇒ Logger

Set a different backend.

Parameters:

  • value (Symbol, String, IO, Logger)

    The new logger backend. Either a Logger object, an IO object, a String containing the logfile path or a Symbol to create a default backend for :syslog or :buffer

Returns:

  • (Logger)

    The newly created backend logger object.



78
79
80
81
82
# File 'lib/madvertise/logging/improved_logger.rb', line 78

def logger=(value)
  @backend = value
  @logger = create_backend
  define_level_methods
end

#messagesArray

Retrieve collected messages in case this instance is a document logger.

Returns:

  • (Array)

    An array of logged messages.



101
102
103
# File 'lib/madvertise/logging/improved_logger.rb', line 101

def messages
  logger.messages if @backend == :document
end

#realtime(severity, msg, attribs = {}, &block) ⇒ Object

Log a realtime benchmark

Parameters:

  • msg (String)

    The log message

  • key (String, Symbol)

    The realtime key



173
174
175
176
177
178
# File 'lib/madvertise/logging/improved_logger.rb', line 173

def realtime(severity, msg, attribs = {}, &block)
  result = nil
  rt = Benchmark.realtime { result = yield }
  add(severity, msg, attribs.merge({rt: rt}))
  return result
end

#restore_token(obj) ⇒ Object

Restore the token that has been associated with obj#object_id.



204
205
206
207
# File 'lib/madvertise/logging/improved_logger.rb', line 204

def restore_token(obj)
  @tokens ||= {}
  @token = @tokens.delete(obj.object_id)
end

#save_token(obj) ⇒ Object

Save the current token and associate it with obj#object_id.



196
197
198
199
200
201
# File 'lib/madvertise/logging/improved_logger.rb', line 196

def save_token(obj)
  if @token
    @tokens ||= {}
    @tokens[obj.object_id] = @token
  end
end

#silence(temporary_level = :error) ⇒ Object

Silence the logger for the duration of the block.



210
211
212
213
214
215
216
217
218
219
220
221
# File 'lib/madvertise/logging/improved_logger.rb', line 210

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