# Пример использования CLS форматирования для оформления сообщений # лога в CLS-синтаксис. # # Используется формат: # {<severity> {timestamp <TimeXmlSchema>} {program <str>} {message <str>}} # # Где <severity> -- это debug/info/warn/error/fatal/any # require 'logger' require 'cls-ruby' require 'cls-ruby/tag_no_value' require 'cls-ruby/tag_scalar' require 'cls-ruby/oneline_formatter' module LogSingleLineFormatter # Класс форматера, который сможет использоваться совместно с Logger. # class Formatter def call( severity, time, progname, msg ) r = '' TagSeverity.new( severity, time, progname, msg2str(msg) ).tag_format( ClsRuby::OneLineFormatter.new( r ) ) r << "\n" end private # Этот метод взят из реализации стандартного Formatter из # реализации Logger в стандартной библиотеке Ruby. def msg2str( msg ) case msg when ::String msg when ::Exception "#{ msg.message } (#{ msg.class })\n" << (msg.backtrace || []).join("\n") else msg.inspect end end # Класс тега severity. class TagSeverity < ClsRuby::TagNoValue mandatory_child_tag :timestamp, ClsRuby::TagScalar, :format => ClsRuby::TimeXmlSchemaScalarParser.new mandatory_child_tag :program, ClsRuby::TagStringScalar mandatory_child_tag :message, ClsRuby::TagStringScalar def initialize( severity, time, progname, msg ) super( :name => severity.downcase ) @timestamp.value = time @program.value = progname || 'UNKNOWN' @message.value = msg # Указываем, что тег определен, в противном случае он # не будет форматироваться. tag_make_defined end end end end # module LogSingleLineFormatter log = Logger.new( STDOUT ) log.progname = $0 log.formatter = LogSingleLineFormatter::Formatter.new log.debug( 'This is a debug message' ) log.info( 'This is an info message' ) log.warn( 'This is a warning message' ) log.error( 'This is an error message' ) log.fatal( 'This is a fatal message' )
# vim:ts=2:sts=2:sw=2:expandtab:ft=txt:tw=78
Generated with the Darkfish Rdoc Generator 2.