The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
##################################################
Revision history for Log::Log4perl
##################################################

0.34 06/08/2003
    * (ms) James FitzGibbon <james.fitzgibbon@target.com> noticed a major
           bug in Log::Log4perl::Appender::File and provided a patch. Problem
           was that 0.33 was reusing the same file handle for every opened file,
           causing all messages to end up in the same file.

0.33 05/30/2003
    * (kg) CPAN rt#2636, coordinating XML::DOM version required across modules
           and unit tests
    * (ms) Removed Log::Dispatch dependency, added standard 
           Log::Log4perl::Appender appenders File and Screen. 
           Log::Dispatch is still supported for backwards compatibility
           and special purpose appenders implemented within this hierarchy.

0.32 05/17/2003
    * (ms) Added fix to Makefile.PL to compensate for MakeMaker bug
           in perl < 5.8.0, causing man pages below Log::Log4perl::Config 
           not to be installed. Thanks to Mathieu Arnold <mat@mat.cc> 
           for bringing this up.
    * (ms) 0.31 had a Win32 test suite glitch, replaced getpwuid() 
           (not implemented) by stat() for Safe test.

0.31 05/08/2003
    * (kg) fixed bug Appender::DBI where it was consuming the message
           array before other appenders could get to it
    * (ms) changed config_and_watch to ignore clock differences between
           system time and file system time (helpful with skewed NFS 
           systems). Added Log::Log4perl::Config::Watch.
    * James FitzGibbon <james.fitzgibbon@target.com>: Added support for
           optionally restricting eval'd code to Safe compartments. 
    * (ms) allow/deny code in configuration files should now be controlled 
           via the accessor Log::Log4perl::Config->allow_code(0/1).
           $Log::Log4perl::ALLOW_CODE_IN_CONFIG_FILE is still supported
           for backwards compatibility.

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

##################################################