Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP

Adds custom logger(s) to any ruby module or class

tree: dd9e33d5e0

Fetching latest commit…

Octocat-spinner-32-eaf2f5

Cannot retrieve the latest commit at this time

Octocat-spinner-32 lib
Octocat-spinner-32 .gitignore
Octocat-spinner-32 Gemfile
Octocat-spinner-32 README.rdoc
Octocat-spinner-32 Rakefile
Octocat-spinner-32 class_logger.gemspec
README.rdoc

Class Logger

Makes adding multiple loggers or custom loggers to any ruby class. Written mainly to have certain models in Rails log to a different file while maintaining the original logger (or overwriting it).

Installation

gem install class_logger

Options

ClassLogger supports a bunch of options that are passed straight to the Logger. Most of these options should make sense, but they are described in further detail in Logger's rdoc files.

rotate:: Set this to daily, weekly, etc. - anything Logger supports
max_size:: Set this to the size you want the log to rotate at (or set +rotate+ above)
keep:: Set this to how many logfiles you want to keep after rotating (or set +rotate+ above)
path:: The path to your log folder. (Default: "%<rails_root>s/log")
in:: This is the name of your logfile. (Use: "%<class_name>s" to interpolate the class's name) (Default: "%<class_name>s.log")
as:: This is the method your logger will be available to the class as. (Default: logger)
formatter:: This can be any custom proc or method you want to assign. (See Logger's rdoc files for more details on this)
level:: This is the log level

Interpolations

The following can be used in the +path+ or +in+ options.

%<rails_root>s:: Will replace itself with Rails.root when in a rails app
%<current>s:: Will replace itself with the +dirname+ of the file
%<parent>s:: Will replace itself with the parent directory of the file
%<class_name>s:: Will replace itself with the name of the class.

Usage

# simple use case to override active records logger
class Transaction < ActiveRecord::Base
  include ClassLogger
  has_logger

  def process!
    logger.info "Creating transation: #{amount}"  # => goes to log/transaction.log
  end
end

# custom logs for special models within rails
# specifying a custom logfile and logger name
class Transaction < ActiveRecord::Base
  include ClassLogger
  has_logger :in => 'gateway.log', :as => :gateway_logger

  def process!
    gateway_logger.info "Creating transation: #{amount}"  # => goes to log/gateway.log
    logger.info "Hello default logger!"                   # => goes to log/<environment>.log
  end
end

# overriding active record's default logger with a custom logfile
class Transaction < ActiveRecord::Base
  include ClassLogger
  has_logger :in => 'gateway.log'

  def process!
    logger.info "Creating transation: #{amount}"  # => goes to log/gateway.log
  end
end

# create a logger for a module
module Something
  include ClassLogger
  has_logger :path => File.expand_path("../log", __FILE__), :in => 'my_module.log'
  has_logger :path => '/var/log', :in => 'utoh.log', :as => :utoh_logger

  # has_logger only makes instance methods, so we need to wrap it up
  def self.logger
    self.loggers[:logger]
  end

  def self.utoh
    self.loggers[:utoh_logger]
  end
end
Something.logger.info "Testing 123"
Something.utoh.error "oops!"

# inside a class with a custom formatter
class Something
  include ClassLogger
  has_logger :path => "%<current>s/log", :rotate => :daily, 
    :formatter => proc{ |severity, time, program_name, message| "[%s](Something): %s\n" % [severity, message] }

  def initialize
    logger.debug "Created Something."
  end
end
Something.new
Something.loggers[:logger].debug "System logger"
Something went wrong with that request. Please try again.