Printing to multiple files ... without changing my code.

Eric Wilhelm scratchcomputing at gmail.com
Fri Sep 15 17:38:42 BST 2006


# from Dan Rowles
# on Friday 15 September 2006 07:58 am:

>Would you be willing to replace your print statements with something
>like Log::Log4perl?

I'll second that, but add that these maybe should have been warn() 
instead of print.  I never use print for anything besides output, and 
then usually only to a filehandle variable (which might = \*STDOUT.)

This allowed us to install a $SIG{__WARN__} which calls the logger as we 
phase into only using logger calls.

>Much more heavyweight than just using print, 

And that.

>but *very* flexible :) 

And that.

If you think doing "my $logger = Log... ... ... (man, this is way too 
long) ... ->new()" is a bit tedious, make your own frontend (e.g. 
My::Logger) which exports something like "sub L (@) {...}".  This also 
makes a great wafer-thin layer in which to store your policy, 
$SIG{__WARN__}, etc.  (Partly inspired by Jifty::Logger.)

I set mine up to use caller() as the log class, optionally appending 
whatever tag is in the L($tag) call.

  sub L (@) {
    my $caller = caller;
    my @tags = @_;
    Log::Log4perl->get_logger(join('.', $caller, map({"#$_"} @tags)));
  }

I also have a "root logger" RL() which doesn't do the $caller stuff in 
the get_logger() call (for tags that span multiple modules -- 
unfortunately a requirement for subclasses unless you want to write 
logger wrappers into all of your base classes.)

So, instead of:

  warn "foo";

You do:

  use My::Logger;
  ...
  L->debug("foo");

--Eric
-- 
"Everything goes wrong all at once."
--Quantized Revision of Murphy's Law
---------------------------------------------------
    http://scratchcomputing.com
---------------------------------------------------


More information about the london.pm mailing list