Project

General

Profile

Feature #9860 ยป logger-application.patch

hsbt (Hiroshi SHIBATA), 05/24/2014 09:20 AM

View differences:

lib/logger.rb
class LogDevice
include Period
end
#
# == Description
#
# Logger::Application --- Add logging support to your application.
#
# == Usage
#
# 1. Define your application class as a sub-class of this class.
# 2. Override the +run+ method in your class to do many things.
# 3. Instantiate it and invoke #start.
#
# == Example
#
# class FooApp < Logger::Application
# def initialize(foo_app, application_specific, arguments)
# super('FooApp') # Name of the application.
# end
#
# def run
# ...
# log(WARN, 'warning', 'my_method1')
# ...
# @log.error('my_method2') { 'Error!' }
# ...
# end
# end
#
# status = FooApp.new(....).start
#
class Application
include Logger::Severity
# Name of the application given at initialize.
attr_reader :appname
#
# :call-seq:
# Logger::Application.new(appname = '')
#
# == Args
#
# +appname+:: Name of the application.
#
# == Description
#
# Create an instance. Log device is +STDERR+ by default. This can be
# changed with #set_log.
#
def initialize(appname = nil)
@appname = appname
@log = Logger.new(STDERR)
@log.progname = @appname
@level = @log.level
end
#
# Start the application. Return the status code.
#
def start
status = -1
begin
log(INFO, "Start of #{ @appname }.")
status = run
rescue
log(FATAL, "Detected an exception. Stopping ... #{$!} (#{$!.class})\n" << $@.join("\n"))
ensure
log(INFO, "End of #{ @appname }. (status: #{ status.to_s })")
end
status
end
# Logger for this application. See the class Logger for an explanation.
def logger
@log
end
#
# Sets the logger for this application. See the class Logger for an
# explanation.
#
def logger=(logger)
@log = logger
@log.progname = @appname
@log.level = @level
end
#
# Sets the log device for this application. See <tt>Logger.new</tt> for
# an explanation of the arguments.
#
def set_log(logdev, shift_age = 0, shift_size = 1024000)
@log = Logger.new(logdev, shift_age, shift_size)
@log.progname = @appname
@log.level = @level
end
def log=(logdev)
set_log(logdev)
end
#
# Set the logging threshold, just like <tt>Logger#level=</tt>.
#
def level=(level)
@level = level
@log.level = @level
end
#
# See Logger#add. This application's +appname+ is used.
#
def log(severity, message = nil, &block)
@log.add(severity, message, @appname, &block) if @log
end
private
def run
# TODO: should be an NotImplementedError
raise RuntimeError.new('Method run must be defined in the derived class.')
end
end
end
lib/logger/application.rb
#
# == Description
#
# Logger::Application --- Add logging support to your application.
#
# == Usage
#
# 1. Define your application class as a sub-class of this class.
# 2. Override the +run+ method in your class to do many things.
# 3. Instantiate it and invoke #start.
#
# == Example
#
# class FooApp < Logger::Application
# def initialize(foo_app, application_specific, arguments)
# super('FooApp') # Name of the application.
# end
#
# def run
# ...
# log(WARN, 'warning', 'my_method1')
# ...
# @log.error('my_method2') { 'Error!' }
# ...
# end
# end
#
# status = FooApp.new(....).start
#
require 'logger'
class Logger
class Application
include Logger::Severity
# Name of the application given at initialize.
attr_reader :appname
#
# :call-seq:
# Logger::Application.new(appname = '')
#
# == Args
#
# +appname+:: Name of the application.
#
# == Description
#
# Create an instance. Log device is +STDERR+ by default. This can be
# changed with #set_log.
#
def initialize(appname = nil)
@appname = appname
@log = Logger.new(STDERR)
@log.progname = @appname
@level = @log.level
end
#
# Start the application. Return the status code.
#
def start
status = -1
begin
log(INFO, "Start of #{ @appname }.")
status = run
rescue
log(FATAL, "Detected an exception. Stopping ... #{$!} (#{$!.class})\n" << $@.join("\n"))
ensure
log(INFO, "End of #{ @appname }. (status: #{ status.to_s })")
end
status
end
# Logger for this application. See the class Logger for an explanation.
def logger
@log
end
#
# Sets the logger for this application. See the class Logger for an
# explanation.
#
def logger=(logger)
@log = logger
@log.progname = @appname
@log.level = @level
end
#
# Sets the log device for this application. See <tt>Logger.new</tt> for
# an explanation of the arguments.
#
def set_log(logdev, shift_age = 0, shift_size = 1024000)
@log = Logger.new(logdev, shift_age, shift_size)
@log.progname = @appname
@log.level = @level
end
def log=(logdev)
set_log(logdev)
end
#
# Set the logging threshold, just like <tt>Logger#level=</tt>.
#
def level=(level)
@level = level
@log.level = @level
end
#
# See Logger#add. This application's +appname+ is used.
#
def log(severity, message = nil, &block)
@log.add(severity, message, @appname, &block) if @log
end
private
def run
# TODO: should be an NotImplementedError
raise RuntimeError.new('Method run must be defined in the derived class.')
end
end
end
test/logger/test_application.rb
# coding: US-ASCII
require 'test/unit'
require 'logger'
require 'logger/application'
require 'tempfile'
class TestLoggerApplication < Test::Unit::TestCase
    (1-1/1)