Class: Tennpipes::Logger

Inherits:
Object
  • Object
show all
Includes:
Extensions
Defined in:
lib/tennpipes-base/logger.rb

Overview

Tennpipess internal logger, using all of Tennpipes log extensions.

Defined Under Namespace

Modules: Colorize, Extensions Classes: Rack

Constant Summary collapse

Levels =

Ruby (standard) logger levels:

:fatal

An not handleable error that results in a program crash

:error

A handleable error condition

:warn

A warning

:info

generic (useful) information about system operation

:debug

low-level information for developers

:devel

Development-related information that is unnecessary in debug mode

{
  :fatal =>  4,
  :error =>  3,
  :warn  =>  2,
  :info  =>  1,
  :debug =>  0,
  :devel => -1,
}
Config =

Configuration for a given environment, possible options are:

:log_level

Once of [:fatal, :error, :warn, :info, :debug]

:stream

Once of [:to_file, :null, :stdout, :stderr] our your custom stream

:log_level

The log level from, e.g. :fatal or :info. Defaults to :warn in the production environment and :debug otherwise.

:auto_flush

Whether the log should automatically flush after new messages are added. Defaults to true.

:format_datetime

Format of datetime. Defaults to: “%d/%b/%Y %H:%M:%S”

:format_message

Format of message. Defaults to: “”%s - - [%s] "%s"“”

:log_static

Whether or not to show log messages for static files. Defaults to: false

:colorize_logging

Whether or not to colorize log messages. Defaults to: true

Defaults are:

:production  => { :log_level => :warn, :stream => :to_file }
:development => { :log_level => :debug, :stream => :stdout }
:test        => { :log_level => :fatal, :stream => :null }

In some cases, configuring the loggers before loading the framework is necessary. You can do so by setting TENNPIPES_LOGGER:

TENNPIPES_LOGGER = { :staging => { :log_level => :debug, :stream => :to_file }}

Examples:

Tennpipes::Logger::Config[:development] = { :log_level => :debug, :stream => :to_file }
# or you can edit our defaults
Tennpipes::Logger::Config[:development][:log_level] = :error
# or you can use your stream
Tennpipes::Logger::Config[:development][:stream] = StringIO.new
{
  :production  => { :log_level => :warn,  :stream => :to_file },
  :development => { :log_level => :debug, :stream => :stdout, :format_datetime => '' },
  :test        => { :log_level => :debug, :stream => :null }
}
@@mutex =
Mutex.new

Constants included from Extensions

Extensions::SOURCE_LOCATION_REGEXP

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Extensions

#bench, #colorize, #colorize!, #enable_source_location?, #exception, #name, #push, #resolve_source_location, #stylized_level

Constructor Details

#initialize(options = {}) ⇒ Logger

To initialize the logger you create a new object, proxies to set_log.

Parameters:

  • options (Hash) (defaults to: {})

Options Hash (options):

  • :stream (Symbol) — default: $stdout

    Either an IO object or a name of a logfile. Defaults to $stdout

  • :log_level (Symbol) — default: :production in the production environment and :debug otherwise

    The log level from, e.g. :fatal or :info.

  • :auto_flush (Symbol) — default: true

    Whether the log should automatically flush after new messages are added. Defaults to true.

  • :format_datetime (Symbol) — default: " [%d/%b/%Y %H:%M:%S] "

    Format of datetime.

  • :format_message (Symbol) — default: "%s -%s%s"

    Format of message.

  • :log_static (Symbol) — default: false

    Whether or not to show log messages for static files.

  • :colorize_logging (Symbol) — default: true

    Whether or not to colorize log messages. Defaults to: true.



371
372
373
374
375
376
377
378
379
380
381
382
383
# File 'lib/tennpipes-base/logger.rb', line 371

def initialize(options={})
  @buffer           = []
  @auto_flush       = options.has_key?(:auto_flush) ? options[:auto_flush] : true
  @level            = options[:log_level] ? Tennpipes::Logger::Levels[options[:log_level]] : Tennpipes::Logger::Levels[:debug]
  @log              = options[:stream]  || $stdout
  @log.sync         = true
  @format_datetime  = options[:format_datetime] || "%d/%b/%Y %H:%M:%S"
  @format_message   = options[:format_message]  || "%s - %s %s"
  @log_static       = options.has_key?(:log_static) ? options[:log_static] : false
  @colorize_logging = options.has_key?(:colorize_logging) ? options[:colorize_logging] : true
  @source_location  = options[:source_location]
  colorize! if @colorize_logging
end

Instance Attribute Details

#auto_flushObject

Returns the value of attribute auto_flush.



259
260
261
# File 'lib/tennpipes-base/logger.rb', line 259

def auto_flush
  @auto_flush
end

#bufferObject (readonly)

Returns the value of attribute buffer.



260
261
262
# File 'lib/tennpipes-base/logger.rb', line 260

def buffer
  @buffer
end

#colorize_loggingObject (readonly)

Returns the value of attribute colorize_logging.



260
261
262
# File 'lib/tennpipes-base/logger.rb', line 260

def colorize_logging
  @colorize_logging
end

#init_argsObject (readonly)

Returns the value of attribute init_args.



260
261
262
# File 'lib/tennpipes-base/logger.rb', line 260

def init_args
  @init_args
end

#levelObject

Returns the value of attribute level.



259
260
261
# File 'lib/tennpipes-base/logger.rb', line 259

def level
  @level
end

#logObject (readonly)

Returns the value of attribute log.



260
261
262
# File 'lib/tennpipes-base/logger.rb', line 260

def log
  @log
end

#log_staticObject

Returns the value of attribute log_static.



259
260
261
# File 'lib/tennpipes-base/logger.rb', line 259

def log_static
  @log_static
end

Class Method Details

.loggerObject



304
305
306
# File 'lib/tennpipes-base/logger.rb', line 304

def self.logger
  @_logger || setup!
end

.logger=(logger) ⇒ Object



308
309
310
311
312
# File 'lib/tennpipes-base/logger.rb', line 308

def self.logger=(logger)
  logger.extend(Tennpipes::Logger::Extensions)

  @_logger = logger
end

.setup!Tennpipes::Logger

Setup a new logger.

Returns:



320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
# File 'lib/tennpipes-base/logger.rb', line 320

def self.setup!
  self.logger = begin
    config_level = (TENNPIPES_LOG_LEVEL || Tennpipes.env || :test).to_sym # need this for TENNPIPES_LOG_LEVEL
    config = Config[config_level]

    unless config
      warn("No logging configuration for :#{config_level} found, falling back to :production")
      config = Config[:production]
    end

    stream = case config[:stream]
      when :to_file
        FileUtils.mkdir_p(Tennpipes.root('log')) unless File.exist?(Tennpipes.root('log'))
        File.new(Tennpipes.root('log', "#{Tennpipes.env}.log"), 'a+')
      when :null   then StringIO.new
      when :stdout then $stdout
      when :stderr then $stderr
      else config[:stream] # return itself, probabilly is a custom stream.
    end

    Tennpipes::Logger.new(config.merge(:stream => stream))
  end
end

Instance Method Details

#<<(message = nil) ⇒ Object Also known as: write

Directly append message to the log.

Parameters:

  • message (String) (defaults to: nil)

    The message



424
425
426
427
428
429
430
431
# File 'lib/tennpipes-base/logger.rb', line 424

def <<(message = nil)
  message << "\n" unless message[-1] == ?\n
  @@mutex.synchronize {
    @buffer << message
  }
  flush if @auto_flush
  message
end

#add(level, message = nil) ⇒ Object

Adds a message to the log - for compatibility with other loggers.



414
415
416
# File 'lib/tennpipes-base/logger.rb', line 414

def add(level, message = nil)
  write(message)
end

#closeNilClass

Close and remove the current log object.

Returns:

  • (NilClass)


405
406
407
408
409
# File 'lib/tennpipes-base/logger.rb', line 405

def close
  flush
  @log.close if @log.respond_to?(:close) && !@log.tty?
  @log = nil
end

#flushObject

Flush the entire buffer to the log object.



392
393
394
395
396
397
398
# File 'lib/tennpipes-base/logger.rb', line 392

def flush
  return unless @buffer.size > 0
  @@mutex.synchronize do
    @log.write(@buffer.join(''))
    @buffer.clear
  end
end

#format(message, level) ⇒ Object



434
435
436
# File 'lib/tennpipes-base/logger.rb', line 434

def format(message, level)
  @format_message % [stylized_level(level), colorize(Time.now.strftime(@format_datetime), :yellow), message.to_s.strip]
end

#source_location?Boolean

Returns:

  • (Boolean)


385
386
387
# File 'lib/tennpipes-base/logger.rb', line 385

def source_location?
  !!@source_location
end