Class: Padrino::Logger

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

Overview

Padrinos internal logger, using all of Padrino log extensions.

Defined Under Namespace

Modules: Colorize, Extensions Classes: Rack

Constant Summary

Levels =
{
  :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_path

Defines log file path or directory if :stream is :to_file

If it's a file, its location is created by mkdir_p.
If it's a directory, it must exist. In this case log name is '<env>.log'

: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 PADRINO_LOGGER:

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

Examples:

Padrino::Logger::Config[:development] = { :log_level => :debug, :stream => :to_file }
# or you can edit our defaults
Padrino::Logger::Config[:development][:log_level] = :error
# or change log file path
Padrino::Logger::Config[:development][:log_path] = 'logs/app-development.txt'
# or change log file directory
Padrino::Logger::Config[:development][:log_path] = '/var/logs/padrino'
# or you can use your stream
Padrino::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.

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.

  • :sanitize_encoding (Symbol) — default: false

    Logger will replace undefined or broken characters with “uFFFD” for Unicode and “?” otherwise. Can be an encoding, false or true. If it's true, logger sanitizes to Encoding.default_external.



394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
# File 'padrino-core/lib/padrino-core/logger.rb', line 394

def initialize(options={})
  @buffer           = []
  @auto_flush       = options.has_key?(:auto_flush) ? options[:auto_flush] : true
  @level            = options[:log_level] ? Padrino::Logger::Levels[options[:log_level]] : Padrino::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]
  @sanitize_encoding = options[:sanitize_encoding] || false
  @sanitize_encoding = Encoding.default_external if @sanitize_encoding == true
  colorize! if @colorize_logging
end

Instance Attribute Details

#auto_flushObject

Returns the value of attribute auto_flush



259
260
261
# File 'padrino-core/lib/padrino-core/logger.rb', line 259

def auto_flush
  @auto_flush
end

#bufferObject (readonly)

Returns the value of attribute buffer



260
261
262
# File 'padrino-core/lib/padrino-core/logger.rb', line 260

def buffer
  @buffer
end

#colorize_loggingObject (readonly)

Returns the value of attribute colorize_logging



260
261
262
# File 'padrino-core/lib/padrino-core/logger.rb', line 260

def colorize_logging
  @colorize_logging
end

#init_argsObject (readonly)

Returns the value of attribute init_args



260
261
262
# File 'padrino-core/lib/padrino-core/logger.rb', line 260

def init_args
  @init_args
end

#levelObject

Returns the value of attribute level



259
260
261
# File 'padrino-core/lib/padrino-core/logger.rb', line 259

def level
  @level
end

#logObject (readonly)

Returns the value of attribute log



260
261
262
# File 'padrino-core/lib/padrino-core/logger.rb', line 260

def log
  @log
end

#log_staticObject

Returns the value of attribute log_static



259
260
261
# File 'padrino-core/lib/padrino-core/logger.rb', line 259

def log_static
  @log_static
end

Class Method Details

.loggerObject



311
312
313
# File 'padrino-core/lib/padrino-core/logger.rb', line 311

def self.logger
  @_logger || setup!
end

.logger=(logger) ⇒ Object



315
316
317
318
319
# File 'padrino-core/lib/padrino-core/logger.rb', line 315

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

  @_logger = logger
end

.setup!Padrino::Logger

Setup a new logger.



327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
# File 'padrino-core/lib/padrino-core/logger.rb', line 327

def self.setup!
  self.logger = begin
    config_level = (PADRINO_LOG_LEVEL || Padrino.env || :test).to_sym # need this for PADRINO_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
        if filename = config[:log_path]
          filename = Padrino.root(filename) unless Pathname.new(filename).absolute?
          if File.directory?(filename)
            filename = File.join(filename, "#{Padrino.env}.log")
          else
            FileUtils.mkdir_p(File.dirname(filename))
          end
          File.new(filename, 'a+')
        else
          FileUtils.mkdir_p(Padrino.root('log')) unless File.exist?(Padrino.root('log'))
          File.new(Padrino.root('log', "#{Padrino.env}.log"), 'a+')
        end
      when :null   then StringIO.new
      when :stdout then $stdout
      when :stderr then $stderr
      else config[:stream] # return itself, probabilly is a custom stream.
    end

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

Instance Method Details

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

Directly append message to the log.



452
453
454
455
456
457
458
459
# File 'padrino-core/lib/padrino-core/logger.rb', line 452

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.



442
443
444
# File 'padrino-core/lib/padrino-core/logger.rb', line 442

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

#closeNilClass

Close and remove the current log object.



433
434
435
436
437
# File 'padrino-core/lib/padrino-core/logger.rb', line 433

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

#flushObject

Flush the entire buffer to the log object.



417
418
419
420
421
422
423
424
425
426
# File 'padrino-core/lib/padrino-core/logger.rb', line 417

def flush
  return unless @buffer.size > 0
  @@mutex.synchronize do
    @buffer.each do |line|
      line.encode!(@sanitize_encoding, :invalid => :replace, :undef => :replace) if @sanitize_encoding
      @log.write(line)
    end
    @buffer.clear
  end
end

#format(message, level) ⇒ Object



462
463
464
# File 'padrino-core/lib/padrino-core/logger.rb', line 462

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

#source_location?Boolean



410
411
412
# File 'padrino-core/lib/padrino-core/logger.rb', line 410

def source_location?
  !!@source_location
end