################################################## Revision history for Log::Log4perl ################################################## 0.30 03/14/2003 * (ms) Added Log4perl custom filter logic and standard filter set * (kg) Added url support to init(), finally documenting it * (kg) Finished implementation of DOMConfigurator allowing xml configs. * (ms) Corrected DateFormat inconsistencies as reported by Roger Perttu <roger.perttu@easit.se> 0.29 01/30/2003 * (kg) Removing debugging from 0.28, big woops * (kg) Fixing 036JSyslog.t, Syslog implementations are too often broken to base any results on. * (kg) Fixing XML-DOM tests, Data::Dumper doesn't return data exactly the same way. 0.28 (01/28/2003) * (ms) '#' in the conf file are now interpreted as comment starters only if they're at the start of a line with optional whitespace. The previous setting (comments starting anywhere) had problems with code containing '#''s, like in layout.cref = sub { $#_ = 1 } * (ms) warp_message accepts code refs or function names * (kg) Split config bits into PropertyConfigurator and implemented DOMConfigurator for XML configs. * (kg) Adding appender.warp_message parameter as a help to DBI appender * (kg) Added NoopLayout to help DBI appender * (ms) Added message output filters: log({filter => \&filter, value => $value}) * (kg) t/024WarnDieCarp was assuming / as directory separator, failed on Win32 * (kg) implemented JavaMaps for NTEventLogAppender, SyslogAppender * (kg) found and addressed circular ref problem in Logger->reset * (kg) moved TestBuffer under Appender/ directory along with DBI * (kg) fixed docs, Pattern layout, %f not supported, s/b %F * (kg) added Log::Log4perl::Appender::DBI to implement JDBCAppender * (ms) Every value in the config file can now be a perl function, dynamically replaced by its return value at configuration parse time * (ms) NDC now prints entire stack, not just top element (as mandated by Log4j) * (ms) Allow trailing spaces after a line-breaking '\' in the config file to be fault-tolerant on cut-and-pasted code 0.27 12/06/2002 * (ms) Updated FAQ with "Recipes of the Week" * (ms) Added Log::Log4perl::NDC (Nested Diagnostic Contexts) and Log::Log4perl::MDC (Mapped Diagnostic Contexts) * (ms) LOGDIE and LOGWARN added to stealth loggers * (ms) Logging methods ($lo->debug(), $lo->info() ...) now return a value, indicating the number of appenders that the message was propagated to. If the message was suppressed due to level constraints, undef is returned. Updated manpage (new section "return values"). * (ms) Fixed bug reported by Francisco Olarte Sanz. <folarte@peoplecall.com>: ISO date format and documentation mixed up MM with mm in the simple date format * (kg) User-defined conversion specifiers for PatternLayout in configuration file and as C API * (kg) implementing map to log4j.RollingFileAppender * (kg) trying out oneMessagePerAppender parameter * (kg) changed unit tests to use File::Spec 0.26 11/11/2002 * (kg) enabled %l (was missing from PatternLayout::define) * (kg) got rid of "Use of uninitialized value in join or string" message when some of $logger->debug(@array) when some of @array are undef * (ms) Stealth loggers and documentation * (kg) Better error message for case reported by Hai Wu * (ms) Added Log/Log4perl/FAQ.pm, which the homepage links to * (ms) Took dependency on Test::More and Test::Simple out of the PPD file because of a problem with Activestate 5.6.1 reported by James Hahn <jrh3@att.com> * (ms) Added Log::Dispatch equivalent levels to the Log4perl loggers, which are passed on the Log::Dispatch appenders now according to the priority of the message instead of the default "DEBUG" setting * (ms) Added %P process ID to PatternLayout as suggested by Paul Harrington <Paul-Harrington@deshaw.com>. Also added %H as hostname * (kg) Added %min.max formatter to PatternLayout * (ms) Updated docs for Log::Log4perl::DateFormat 0.25 10/06/2002 * (ms) backwards-compatibility with perl 5.00503 * (ms) added system-wide threshold, fixed java-app thresholds * (kg) Nested configuration structures for appenders like L::D::Jabber * (ms) ::Log4perl::Appender::threshold() accepts strings or integer levels (as submitted by Aaron Straup Cope <asc@vineyard.net>) * (ms) Fixed logdie/logwarn caller(x) offset bug reported by Brian Duffy <Brian.Duffy@DFA.STATE.NY.US> * (ms) dies now on PatternLayout without ConversionPattern (helps detecting typos in conf files) 0.24 09/26/2002 * (kg) Fix for init_and_watch and test cases * (ms) Added documentation for Log::Log4perl::Config * (ms) Added log4perl.additivity.loggerName conf file syntax * (ms) Assume Log::Log4perl::Layout prefix of 'relative' layout class names in conf file (say 'SimpleLayout' instead of 'Log::Log4perl::Layout::SimpleLayout'). * (ms) accidently appending a ';' at the end of an appender class in a conf file now spits out a reasonable error message * (ms) added a by_name() method to TestBuffer to retrieve an instance of the TestBuffer population by name instead of relying on the order of creation via POPULATION[x] (for testing only). * (kg) Win32 compatibility fixes 0.23 09/14/2002 * Both Log4perl/log4perl is now accepted in conf file * Added documentation to Log::Log4perl::Appender * Made Time::HiRes optional. If it's missing, PatternLayout will just use full seconds as %r. * SimpleDateFormat "%d{HH:SS}", including predefined formats (DATE etc.) * Added another cut-and-paste example to the docs (EXAMPLE) * Added new logdie/logwarn/error_warn/error_die/logcarp/ logcluck/logcroak/logconfess functions written by Erik Selberg <erik@selberg.com> * Added PatternLayout documentation * Changed suppression of duplicate newline in log message algorithm * Custom levels and inc_level/dec_level/more_logging/less_logging added by Erik Selberg <erik@selberg.com> * Append to logfile by default if Log::Dispatch::File is used (previously clobbered by default) * Kevin's init_and_watch fix 0.22 8/17/2002 * Threshold settings of appenders: $appender->threshold($ERROR); log4j.appender.A.Threshold = ERROR * Chris R. Donnelly <cdonnelly@digitalmotorworks.com> submitted two patches: - extended init() to take obj references (added, also added a test case and documentation) - fixed %F and %L if Log4perl is used by a wrapper class (accepted, but changed variable name to Log::Log4perl::caller_depth as a tribute to Log::Dispatch::Config, added test case 022Wrap and documentation 0.21 8/08/2002 * Synopsis shows code samples in Log4perl.pm/README * Slight Log4j incompatibility but useful: %F{n} lets you limit the number of entries the source file path is logged * Erik W. Selberg (erik@selberg.com) suggested having PatternLayout.pm suppress another \n if the messages already contains a \n and the format requires a %n. Done. * Erik W. Selberg (erik@selberg.com) suggested loggers should take any number of messages and concatenate them. Done. * Fixed double-init problem and added a test case. Now the entire configuration is cleared before the second init(). However, this surfaced a problem with init_and_watch: If a program obtains references to one or more loggers, rewriting the configuration file during program execution and re-initing makes these reference point to loggers which hold obsolete configurations. Fixed that by code in debug(), info(), etc. which *replaces* (shudder) the logger reference the program hands in to them with a new one of the same category. This happens every time if 'init_and_watch' has been enabled. However, this introduces a small runtime penalty. This is different from the original log4j, which does some half-assed re-initialization, because Java isn't expressive enough to allow for it. Making this thread-safe might be tough, though. * Added DEBUG statements to Logger.pm and Config.pm to trace execution (debugging won't work because of "eval"s). Both files define a constant named DEBUG towards the top of the file, which will have perl optimize away the debug statements in case it's set to 0. * A warning is issued now (once) if init() hasn't been called or no appenders have been defined. * Added ':levels' target to Log::Log4perl to import $DEBUG, $ERROR, etc. levels (just like 'use Log::Log4perl::Level' works). * Added ':easy' target to allow for simple setup * Code references can be passed in as log messages to avoid parameter passing penalty 0.20 7/23/2002 * Strip trailing spaces in config file * Accept line continuations in properties file * Refactored Logger.pm for speed, defined the logging behavior when the logger is created, not when a message is logged * Fixing test suites so that SimpleFormat newline is accounted for * Fixed a bug with root inheritance where the category name wasn't coming through * added init_and_watch 0.19 07/16/2002 * Added Log::Log4perl::Appender::TestBuffer back in the distribution, otherwise regression test suite would fail. 0.18 07/16/2002 * Failed attempt to fix the Log::Dispatch::Buffer problem. 0.17 07/11/2002 * Updated documentation according to Dave Rolsky's suggestions * Lots of other documentation fixes * Fixed bug in renderer, %M was displayed as the logger function bumped up the level by 1 * Fixed %% bug 0.16 07/10/2002 * Updated documentation for CPAN release * Applied Kevin's patch to limit it to one Log::Dispatcher 0.15 07/10/2002 * There were name conflicts in Log::Dispatch, because we used *one* Log::Dispatch object for the *all* loggers in the Log::Log4perl universe (it still worked because we were using log_to() for Log::Dispatch to send messages to specific appenders only). Now every logger has its own Log::Dispatch object. Logger.pm doesn't call Kevin's anti-dupe logic anymore -- is this ok? Maybe there's some leftovers which need to be cleaned up. * Kevin fixed t/014ConfErrs.t after last night's Appender.pm change 0.14 07/09/2002 * (!) Added new class Log::Log4perl::Appender as a wrapper around Log::Dispatch::*. Layouts are no longer attached to the loggers, but to the appenders instead. $app->layout($layout) sets the layout. $logger->add_appender($app) is the new syntax to add an appender to a logger. The $logger->layout method is gone for that reason. * Added documentation on categories * Added documentation on Log::Log4perl::Appender, Log::Log4perl::Layout::SimpleLayout, Log::Log4perl::Layout::PatternLayout. 0.13 07/09/2002 * in the config files, 'debug' is not a level, 'DEBUG' is * expanded the layouts so that we can add subclassess, added SimpleLayout, note that api usage changes -$logger->layout('buf',"The message is here: %m"); +$logger->layout(new Log::Log4perl::Layout::PatternLayout('buf',"The message is here: %m")); * did benchmarks, see doc/benchmark*, t/013Bench.t * further tweaked errors for bad configuration, added a test for those 0.12 07/08/2002 * Log::Log4perl::Logger->get_logger now accessible via Log::Log4perl->get_logger() * Log::Log4perl::Config->init now accessible via Log::Log4perl->init() * Adapted test cases to new shortcuts * Constrained some files to 80 chars width * Added test case t/009Deuce.t for two appenders in one category via the config file * Changed default layout in case there's none defined (SimpleLayout) * Implemented dictatory date format for %d: yyyy/MM/dd hh:mm:ss 0.11 07/07/2002 * added documentation to Log/Log4perl.pm * added is_debug/is_error/is_info etc. functions to Logger.pm, test cases to t/002Logger.t 0.10 07/05/2002 * %p should return level name of the calling function, so $logger->warn('bad thing!!') should print 'WARN - bad thing' even if the category is set to debug, so took level_str out of Logger.pm (kg) 0.09 07/03/2002 * %p should return level name, not number, adding level_str to Logger.pm (kg) * Level.pm - discriminating: priorities are 1-4, levels are 'info','debug',etc (kg) 0.08 07/03/2002 * Non-root loggers are working now off the config file 0.07 07/02/2002 * Updated documentation * removed "diagnostics" 0.06 07/01/2002 * Bug discovered by Kevin Goess <cpan@goess.org>, revealed in 004-Config.t: Wrong layout used if Appender is inherited. Fixed. * Changed Log::Log4perl::Appender::TestBuffer to keep track of the object population -- so we can easily reference them in the Log::Log4perl test cases. Got rid of get_buffer(). * Added a reset() method to Log::Log4perl and Log::Log4perl::Logger for easier testing. It resets all persistent loggers to the inital state. * Added documentation 0.05 06/30/2002 * Fixed bug with mapped priorities between java/Log::Dispatch * Java/Perl integration with conf file 0.04 06/30/2002 * Layout tests * %r to layout * Added lib4j configuration file stuff and tests 0.03 06/30/2002 * Layout * Curly braces in Layout first ops 0.02 06/30/2002 * Created Logger and test cases 0.01 06/22/2002 * Where it all began TODO (not assigned to anybody yet): ################################################## * objects passed via the config hash are stringified by Config.pm (requires a significant change on how to init via a hash ref, something like a HashConfigurator class) * BasicConfigurator() vs. :easy, PropertyConfigurator() * get_logger() thread safety (two try to create it at the same time) * Thread safety with appenders, e.g. two threads calling the File::Dispatch appender's log method * Thread safety with re-reading the conf file (watch) * Object rendering * log4j.logger.blah = INHERITED, app * variable subst: a=b log4j.blah = ${a} * log4j.renderer.blah = blah * permission problems, init() creates the files, maybe read later by different uid, no way to set umask? * Custom filters TODO Kevin: ################################################## * use squirrel http://www.perlmeister.com/scripts/squirrel? * document oneMessagePerAppender as a bona-fide feature * appender-by-name stuff? * implement? #"log4j will render the content of the log message according to # user specified criteria. For example, if you frequently need # to log Oranges, an object type used in your current project, # then you can register an OrangeRenderer that will be invoked # whenever an orange needs to be logged. " TODO Mike: ################################################## * index.html on sourceforge should be part of CVS * Release script should maintain old CPAN message on index.html * Turning on DEBUG in Logger.pm results in broken test cases and warnings * Layout.pm: '%t' * README tests (Pod::Tests or something) * Just had a wild idea: Could we possibly utilize the compiler frontend to eliminate log statements that are not going to be triggered? This would be a HUGE performance increase! * Write a bunch of useful appenders for Log::Dispatch like RollingLogFile ##################################################