lib/loggability/formatter.rb in loggability-0.14.0 vs lib/loggability/formatter.rb in loggability-0.15.0.pre20190714094638

- old
+ new

@@ -1,30 +1,32 @@ -#!/usr/bin/env ruby +# -*- ruby -*- # vim: set nosta noet ts=4 sw=4: -# encoding: utf-8 +# frozen_string_literal: true require 'loggability' unless defined?( Loggability ) ### An abstract base class for Loggability log formatters. class Loggability::Formatter - # The default sprintf pattern - DEFAULT_DATETIME_FORMAT = '%Y-%m-%d %H:%M:%S' - - ## # Derivative classes, keyed by name - class << self; attr_reader :derivatives; end + singleton_class.attr_reader( :derivatives ) @derivatives = {} ### Inherited hook -- add subclasses to the ::derivatives Array. def self::inherited( subclass ) super - classname = subclass.name.sub( /.*::/, '' ).downcase.to_sym - Loggability::Formatter.derivatives[ classname ] = subclass + + if ( name = subclass.name ) + classname = name.sub( /.*::/, '' ).downcase + else + classname = "anonymous_%d" % [ subclass.object_id ] + end + + Loggability::Formatter.derivatives[ classname.to_sym ] = subclass end ### Create a formatter of the specified +type+, loading it if it hasn't already been ### loaded. @@ -40,71 +42,15 @@ [ type, self.derivatives, self, type.to_s.capitalize ] end end - - ### Initialize a new Loggability::Formatter. The specified +logformat+ should - ### be a sprintf pattern with positional placeholders: - ### - ### [<tt>%1$s</tt>] Time (pre-formatted using strftime with the +datetime_format+) - ### [<tt>%2$d</tt>] Time microseconds - ### [<tt>%3$d</tt>] PID - ### [<tt>%4$s</tt>] Thread ID - ### [<tt>%5$s</tt>] Severity - ### [<tt>%6$s</tt>] Object/Program Name - ### [<tt>%7$s</tt>] Message - ### - def initialize( logformat, datetime_format=DEFAULT_DATETIME_FORMAT ) - @format = logformat.dup - @datetime_format = datetime_format.dup - end - - - ###### - public - ###### - - # Main log sprintf format - attr_accessor :format - - # Strftime format for log messages - attr_accessor :datetime_format - - ### Create a log message from the given +severity+, +time+, +progname+, and +message+ ### and return it. def call( severity, time, progname, message ) - timeformat = self.datetime_format - args = [ - time.strftime( timeformat ), # %1$s - time.usec, # %2$d - Process.pid, # %3$d - Thread.current == Thread.main ? 'main' : Thread.current.object_id, # %4$s - severity.downcase, # %5$s - progname, # %6$s - self.msg2str(message, severity) # %7$s - ] - - return self.format % args + raise NotImplementedError, "%p doesn't implement required method %s" % + [ self.class, __method__ ] end - - ######### - protected - ######### - - ### Format the specified +msg+ for output to the log. - def msg2str( msg, severity ) - case msg - when String - return msg - when Exception - bt = severity == 'DEBUG' ? msg.backtrace.join("\n") : msg.backtrace.first - return "%p: %s from %s" % [ msg.class, msg.message, bt ] - else - return msg.inspect - end - end end # class Loggability::Formatter