# Пример использования 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.