0
# Merb::Logger = Extlib::Logger
0
+class Merb::Logger < Extlib::Logger
0
+ def verbose!(message, level = :warn)
0
+ send("#{level}!", message) if Merb::Config[:verbose]
0
+ def verbose(message, level = :warn)
0
+ send(level, message) if Merb::Config[:verbose]
0
+# require "time" # httpdate
0
# ==== Public Merb Logger API
0
# To replace an existing logger with a new one:
0
# Merb::Logger.new(log{String, IO},level{Symbol, String})
0
- class Logger < Extlib::Logger
0
+ attr_accessor :delimiter
0
+ attr_accessor :auto_flush
0
+ attr_reader :init_args
0
+ # Ruby (standard) logger levels:
0
+ # :fatal:: An unhandleable error that results in a program crash
0
+ # :error:: A handleable error condition
0
+ # :info:: generic (useful) information about system operation
0
+ # :debug:: low-level information for developers
0
+ }) unless const_defined?(:Levels)
0
- # Appends a message to the log if the specified log level is at least as high as
0
- # the log level of the logger if Merb::Config[:verbose]. Then flushes the log
0
+ # Readies a log for writing.
0
- # message<String>:: The message to be logged.
0
- # level<Symbol>:: The level at which to log. Default is :warn.
0
+ # log<IO, String>:: Either an IO object or a name of a logfile.
0
+ def initialize_log(log)
0
+ close if @log # be sure that we don't leave open files laying around.
0
+ if log.respond_to?(:write)
0
+ elsif File.exist?(log)
0
+ @log = open(log, (File::WRONLY | File::APPEND))
0
+ FileUtils.mkdir_p(File.dirname(log)) unless File.directory?(File.dirname(log))
0
+ @log = open(log, (File::WRONLY | File::APPEND | File::CREAT))
0
+ @log.write("#{Time.now.httpdate} #{delimiter} info #{delimiter} Logfile created\n")
0
+ # To initialize the logger you create a new object, proxies to set_log.
0
- # self:: The logger object for chaining.
0
+ # *args:: Arguments to create the log from. See set_logs for specifics.
0
+ # Replaces an existing logger with a new one.
0
- def verbose!(message, level = :warn)
0
- send("#{level}!", message) if Merb::Config[:verbose]
0
+ # log<IO, String>:: Either an IO object or a name of a logfile.
0
+ # log_level<~to_sym>::
0
+ # The log level from, e.g. :fatal or :info. Defaults to :error in the
0
+ # production environment and :debug otherwise.
0
+ # Delimiter to use between message sections. Defaults to " ~ ".
0
+ # auto_flush<Boolean>::
0
+ # Whether the log should automatically flush after new messages are
0
+ # added. Defaults to false.
0
+ def set_log(stream = Merb::Config[:log_stream],
0
+ log_level = Merb::Config[:log_level],
0
+ delimiter = Merb::Config[:log_delimiter],
0
+ auto_flush = Merb::Config[:log_auto_flush])
0
+ @delimiter = delimiter
0
+ @auto_flush = auto_flush
0
+ @level = Levels[log_level]
0
+ @mutex = (@@mutex[@log] ||= Mutex.new)
0
+ # Flush the entire buffer to the log object.
0
+ return unless @buffer.size > 0
0
+ @log.write(@buffer.slice!(0..-1).to_s)
0
+ # Close and remove the current log object.
0
+ @log.close if @log.respond_to?(:close) && !@log.tty?
0
- # Appends a message to the log if the specified log level is at least as high as
0
- # the log level of the logger if Merb::Config[:verbose].
0
+ # Appends a message to the log. The methods yield to an optional block and
0
+ # the output of this block will be appended to the message.
0
- # message<String>:: The message to be logged.
0
- # level<Symbol>:: The level at which to log. Default is :warn.
0
+ # string<String>:: The message to be logged. Defaults to nil.
0
- # self:: The logger object for chaining.
0
- def verbose(message, level = :warn)
0
- send(level, message) if Merb::Config[:verbose]
0
+ # String:: The resulting message added to the log file.
0
+ message << string if string
0
+ message << "\n" unless message[-1] == ?\n
0
+ # Generate the logging methods for Merb.logger for each log level.
0
+ Levels.each_pair do |name, number|
0
+ class_eval <<-LEVELMETHODS, __FILE__, __LINE__
0
+ # Appends a message to the log if the log level is at least as high as
0
+ # the log level of the logger.
0
+ # string<String>:: The message to be logged. Defaults to nil.
0
+ # self:: The logger object for chaining.
0
+ def #{name}(message = nil)
0
+ self << message if #{number} >= level
0
+ # Appends a message to the log if the log level is at least as high as
0
+ # the log level of the logger. The bang! version of the method also auto
0
+ # flushes the log buffer to disk.
0
+ # string<String>:: The message to be logged. Defaults to nil.
0
+ # self:: The logger object for chaining.
0
+ def #{name}!(message = nil)
0
+ self << message if #{number} >= level
0
+ flush if #{number} >= level
0
+ # Boolean:: True if this level will be logged by this logger.