diff --git lib/logger.rb lib/logger.rb index ca667f4..d931931 100644 --- lib/logger.rb +++ lib/logger.rb @@ -741,128 +741,4 @@ private 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 Logger.new 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 Logger#level=. - # - 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 diff --git lib/logger/application.rb lib/logger/application.rb new file mode 100644 index 0000000..5be56de --- /dev/null +++ lib/logger/application.rb @@ -0,0 +1,127 @@ +# +# == 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 Logger.new 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 Logger#level=. + # + 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 diff --git test/logger/test_application.rb test/logger/test_application.rb index a56308b..ab4d719 100644 --- test/logger/test_application.rb +++ test/logger/test_application.rb @@ -1,6 +1,6 @@ # coding: US-ASCII require 'test/unit' -require 'logger' +require 'logger/application' require 'tempfile' class TestLoggerApplication < Test::Unit::TestCase