Log 4 perl Mike Schilli Yahoo OSCON 07242008

  • Slides: 109
Download presentation
Log 4 perl Mike Schilli, Yahoo! OSCON, 07/24/2008

Log 4 perl Mike Schilli, Yahoo! OSCON, 07/24/2008

Logging – why? • Debug during development • Go back in time and figure

Logging – why? • Debug during development • Go back in time and figure out what happened. • Measure performance • Trace activity on live systems

Why Log 4 perl and not one of the 20 Logging modules on CPAN?

Why Log 4 perl and not one of the 20 Logging modules on CPAN? • No CPAN dependencies • Easy to use, but scales with complexity • Unique Features

Log: : Log 4 perl Availability • cpan> install Log: : Log 4 perl

Log: : Log 4 perl Availability • cpan> install Log: : Log 4 perl (Only requires core modules) • Included in major Linux distros sudo apt-get install liblog-log 4 perl • Requires Perl 5. 00503 or better • Windows: ppm package available in Active. State archives or from log 4 perl. com

Use Log 4 perl as a Remote Control to your System.

Use Log 4 perl as a Remote Control to your System.

Log: : Log 4 perl Remote Controls Levels Loggers Layouts Appenders

Log: : Log 4 perl Remote Controls Levels Loggers Layouts Appenders

Log: : Log 4 perl Remote Controls Levels Log/Suppress Priority/Level Loggers Locate it in

Log: : Log 4 perl Remote Controls Levels Log/Suppress Priority/Level Loggers Locate it in the system Layouts Format it Appenders Write it out

Log: : Log 4 perl Remote Controls Levels Loggers Layouts Appenders DEBUG “Starting up”;

Log: : Log 4 perl Remote Controls Levels Loggers Layouts Appenders DEBUG “Starting up”; ERROR “Cannot open $file”; Turn logging on in main or Net: : Amazon “Starting up” => 2007 -06 -21 07: 30: 33 Foo. pm-123 Starting up Log File Database …

Sounds complicated? Actually, it’s easy …

Sounds complicated? Actually, it’s easy …

Easy Log 4 perl #!/usr/bin/perl –w use strict; use Log: : Log 4 perl

Easy Log 4 perl #!/usr/bin/perl –w use strict; use Log: : Log 4 perl qw(: easy); DEBUG “Starting up”;

Don’t like macros? Use get_logger() #!/usr/bin/perl –w use strict; use Log: : Log 4

Don’t like macros? Use get_logger() #!/usr/bin/perl –w use strict; use Log: : Log 4 perl qw(get_logger); my $logger = get_logger(); $logger->debug(“Starting up”);

Like it clean? Use Moose! package Ferrari; use Moose; with “Moose. X: : Log

Like it clean? Use Moose! package Ferrari; use Moose; with “Moose. X: : Log 4 perl”; sub drive { my($self) = @_; $self->log->debug(“Wroom!!”); }

Easy Log 4 perl #!/usr/bin/perl –w use strict; use Log: : Log 4 perl

Easy Log 4 perl #!/usr/bin/perl –w use strict; use Log: : Log 4 perl qw(: easy); DEBUG “Starting up”;

Easy Log 4 perl $. /hello $

Easy Log 4 perl $. /hello $

Easy Log 4 perl #!/usr/bin/perl –w use strict; use Log: : Log 4 perl

Easy Log 4 perl #!/usr/bin/perl –w use strict; use Log: : Log 4 perl qw(: easy); Log: : Log 4 perl->easy_init( $DEBUG ); DEBUG “Starting up”;

Easy Log 4 perl $. /hello 2008/07/08 18: 37: 12 Starting up $

Easy Log 4 perl $. /hello 2008/07/08 18: 37: 12 Starting up $

Easy Log 4 perl #!/usr/bin/perl –w use strict; use Log: : Log 4 perl

Easy Log 4 perl #!/usr/bin/perl –w use strict; use Log: : Log 4 perl qw(: easy); Log: : Log 4 perl->easy_init( $DEBUG ); DEBUG “Starting up”; # … something happens ERROR “Horrible error!”;

Easy Log 4 perl $. /hello 2008/07/08 18: 37: 12 Starting up 2008/07/08 18:

Easy Log 4 perl $. /hello 2008/07/08 18: 37: 12 Starting up 2008/07/08 18: 37: 12 Horrible error! $

Easy Log 4 perl #!/usr/bin/perl –w use strict; use Log: : Log 4 perl

Easy Log 4 perl #!/usr/bin/perl –w use strict; use Log: : Log 4 perl qw(: easy); Log: : Log 4 perl->easy_init( $ERROR ); DEBUG “Starting up”; ERROR “Horrible error!”;

Easy Log 4 perl $. /hello 2008/07/08 18: 37: 12 Horrible error! $

Easy Log 4 perl $. /hello 2008/07/08 18: 37: 12 Horrible error! $

Remote Control #1: Levels

Remote Control #1: Levels

You get the concept: FATAL ERROR WARNING INFO DEBUG TRACE Message Priority Log Level

You get the concept: FATAL ERROR WARNING INFO DEBUG TRACE Message Priority Log Level Configured

Chatty configuration FATAL ERROR WARNING INFO DEBUG TRACE Message Priority TRACE Log Level Configured

Chatty configuration FATAL ERROR WARNING INFO DEBUG TRACE Message Priority TRACE Log Level Configured

Silent configuration FATAL ERROR WARNING INFO DEBUG TRACE Message Priority ERROR Log Level Configured

Silent configuration FATAL ERROR WARNING INFO DEBUG TRACE Message Priority ERROR Log Level Configured

Log Levels • Choose them wisely – TRACE(“$bytes transferred”); – DEBUG(“HTTP get OK”); –

Log Levels • Choose them wisely – TRACE(“$bytes transferred”); – DEBUG(“HTTP get OK”); – INFO(“Starting up”); – WARN(“HTTP get failed, retrying”); – ERROR(“Out of retries!”); – FATAL(“Panic! Shutting down. ”);

Remote Control #2: Layouts

Remote Control #2: Layouts

Location-Awareness • Log 4 perl’s Loggers are aware of their location: package Foo; use

Location-Awareness • Log 4 perl’s Loggers are aware of their location: package Foo; use Log: : Log 4 perl qw(: easy); sub foo { DEBUG “Starting up”; }

Location-Awareness package Foo; use Log: : Log 4 perl qw(: easy); sub foo {

Location-Awareness package Foo; use Log: : Log 4 perl qw(: easy); sub foo { DEBUG “Starting up”; } $. /hello 2008/07/13 19: 32: 39 Starting up

Location-Awareness package Foo; use Log: : Log 4 perl qw(: easy); sub foo {

Location-Awareness package Foo; use Log: : Log 4 perl qw(: easy); sub foo { DEBUG “Starting up”; } $. /hello 637 Foo: : foo. /Foo. pm-4> Starting up

Location-Awareness package main; use Log: : Log 4 perl (: easy); Log: : Log

Location-Awareness package main; use Log: : Log 4 perl (: easy); Log: : Log 4 perl->easy_init({ level => $DEBUG, layout => “%r %M %F-%L> %m%n”, }); Foo: : foo(); # unchanged! $. /hello 637 Foo: : foo. /Foo. pm-4> Starting up

Configuration Files If this becomes unwieldy: Log: : Log 4 perl->easy_init({ level => $DEBUG,

Configuration Files If this becomes unwieldy: Log: : Log 4 perl->easy_init({ level => $DEBUG, layout => “%r %M %F-%L>%m%n”, });

Configuration Files #l 4 p. conf l 4 p. logger = DEBUG, Screen l

Configuration Files #l 4 p. conf l 4 p. logger = DEBUG, Screen l 4 p. appender. Screen = Log: : Log 4 perl: : Appender: : Screen l 4 p. appender. Screen. Layout = Pattern. Layout l 4 p. appender. Screen. Layout. Conversion. Pattern = %r %M %F-%L> %m%n Log: : Log 4 perl->init( “l 4 p. conf” );

Advantages of Config Files • Can be edited – indepentently of the script –

Advantages of Config Files • Can be edited – indepentently of the script – while the script runs – by people without access to the code

Remote Control #3: Categories (Loggers)

Remote Control #3: Categories (Loggers)

Turn on Logging Everywhere Script l 4 p. logger = DEBUG, Screen Modules

Turn on Logging Everywhere Script l 4 p. logger = DEBUG, Screen Modules

Using Categories Script l 4 p. logger. Net. Amazon =  DEBUG, Screen Modules

Using Categories Script l 4 p. logger. Net. Amazon = DEBUG, Screen Modules Net: : Amazon

Using Categories main Script l 4 p. logger. main =  Modules DEBUG, Screen

Using Categories main Script l 4 p. logger. main = Modules DEBUG, Screen Net: : Amazon

Using Categories main Script l 4 p. logger. main = DEBUG, Screen l 4

Using Categories main Script l 4 p. logger. main = DEBUG, Screen l 4 p. logger. Net. Amazon = DEBUG, Screen Modules Net: : Amazon

Categories #l 4 p. conf l 4 p. logger. main = DEBUG, Screen l

Categories #l 4 p. conf l 4 p. logger. main = DEBUG, Screen l 4 p. logger. Net. Amazon = DEBUG, Screen l 4 p. appender. Screen = Log: : Log 4 perl: : Appender: : Screen l 4 p. appender. Screen. Layout = Pattern. Layout l 4 p. appender. Screen. Layout. Conversion. Pattern = %r %M %F-%L> %m%n main Net: : Amazon

Category Inheritance #l 4 p. conf l 4 p. logger. Net = DEBUG, Screen

Category Inheritance #l 4 p. conf l 4 p. logger. Net = DEBUG, Screen l 4 p. appender. Screen = Log: : Log 4 perl: : Appender: : Screen l 4 p. appender. Screen. Layout = Pattern. Layout l 4 p. appender. Screen. Layout. Conversion. Pattern = %r %M %F-%L> %m%n main Net: : Google Net: : Amazon

Remote Control #5: Appenders

Remote Control #5: Appenders

Root Logger #l 4 p. conf l 4 p. logger = DEBUG, Screen l

Root Logger #l 4 p. conf l 4 p. logger = DEBUG, Screen l 4 p. appender. Screen = Log: : Log 4 perl: : Appender: : Screen l 4 p. appender. Screen. Layout = Pattern. Layout l 4 p. appender. Screen. Layout. Conversion. Pattern = %r %M %F-%L> %m%n main Net: : Google Net: : Amazon

Multiple Appenders #l 4 p. conf l 4 p. logger. main = DEBUG, Screen

Multiple Appenders #l 4 p. conf l 4 p. logger. main = DEBUG, Screen l 4 p. logger. Net. Amazon = DEBUG, File l 4 p. appender. Screen = Log: : Log 4 perl: : Appender: : Screen l 4 p. appender. Screen. Layout = Simple. Layout l 4 p. appender. File = Log: : Log 4 perl: : Appender: : File l 4 p. appender. File. filename = /var/log/myapp. log l 4 p. appender. File. Layout = Pattern. Layout l 4 p. appender. File. Layout. Conversion. Pattern = %r %M %F-%L> %m%n main Screen Net: : Amazon File

Multiple Appenders (different log levels) #l 4 p. conf l 4 p. logger. main

Multiple Appenders (different log levels) #l 4 p. conf l 4 p. logger. main = DEBUG, Screen l 4 p. logger. Net. Amazon = ERROR, File l 4 p. appender. Screen = Log: : Log 4 perl: : Appender: : Screen l 4 p. appender. Screen. Layout = Simple. Layout l 4 p. appender. File = Log: : Log 4 perl: : Appender: : File l 4 p. appender. File. filename = /var/log/myapp. log l 4 p. appender. File. Layout = Pattern. Layout l 4 p. appender. File. Layout. Conversion. Pattern = %r %M %F-%L> %m%n main Screen Net: : Amazon File

Multiple Appenders #l 4 p. conf l 4 p. logger. main = DEBUG, Screen,

Multiple Appenders #l 4 p. conf l 4 p. logger. main = DEBUG, Screen, File l 4 p. appender. Screen = Log: : Log 4 perl: : Appender: : Screen l 4 p. appender. Screen. Layout = Simple. Layout l 4 p. appender. File = Log: : Log 4 perl: : Appender: : File l 4 p. appender. File. filename = /var/log/myapp. log l 4 p. appender. File. Layout = Pattern. Layout l 4 p. appender. File. Layout. Conversion. Pattern = %r %M %F-%L> %m%n main Screen Net: : Amazon File

Log 4 perl Flow Application sends a log message (Category, Priority) Log 4 perl

Log 4 perl Flow Application sends a log message (Category, Priority) Log 4 perl Configuration decides go/no go, based on Category and Priority ? Layout Appender

Log 4 perl and Log 4 j • Log: : Log 4 perl ports

Log 4 perl and Log 4 j • Log: : Log 4 perl ports Log 4 j to Perl • Log 4 j: de facto Java logging standard, by Ceki Gülcü – Latest development: ‘logback’ • http: //logging. apache. org/log 4 j • Log: : Log 4 perl adds perlisms demanded by users

Log 4 perl History • • 0. 01 release 2002 Current release 1. 17

Log 4 perl History • • 0. 01 release 2002 Current release 1. 17 (07/2008) Authors: Mike Schilli, Kevin Goess Used by major banks, target. com, fedex. com, Yahoo!, Google, … • Several CPAN modules support it (e. g. Catalyst, Net: : Amazon, …) • Every major Linux distro has it (Ubuntu, Suse, Fedora …)

Log 4 perl Release History

Log 4 perl Release History

Design Goals • Easy to use in small scripts • Scales easily with growing

Design Goals • Easy to use in small scripts • Scales easily with growing architecture • Log 4 perl-enabled CPAN modules can be used with and without Log 4 perl initialization • Optimized for Speed • Open Architecture, extensible

Combine Remote Controls • Write code once, and L 4 p-enabled scripts/modules can be

Combine Remote Controls • Write code once, and L 4 p-enabled scripts/modules can be used – with any logging configuration you desire – by changing loggers, appenders and layouts independently – similar to dtrace probes • No need to change your source code to change the logging behavior

Init and Watch • Log: : Log 4 perl->init(“l 4 p. conf”); • Log:

Init and Watch • Log: : Log 4 perl->init(“l 4 p. conf”); • Log: : Log 4 perl->init($conf_string); • Log: : Log 4 perl->init_and_watch(“l 4 p. conf”, 30); • Log: : Log 4 perl->init_and_watch(“l 4 p. conf”, ‘HUP’ );

Demo

Demo

Appenders • Appenders are output sinks • Get called if a message passes category

Appenders • Appenders are output sinks • Get called if a message passes category and level hurdles

Appenders • Log: : Log 4 perl: : Appender: : Screen Log: : Log

Appenders • Log: : Log 4 perl: : Appender: : Screen Log: : Log 4 perl: : Appender: : File Log: : Log 4 perl: : Appender: : Socket Log: : Log 4 perl: : Appender: : DBI Log: : Log 4 perl: : Appender: : Synchronized Log: : Log 4 perl: : Appender: : RRDs • Log: : Dispatch provides even more:

Log: : Dispatch Appenders • Log: : Dispatch: : Apache. Log: : Dispatch: :

Log: : Dispatch Appenders • Log: : Dispatch: : Apache. Log: : Dispatch: : DBI, Log: : Dispatch: : Email: : MIMELite Log: : Dispatch: : File. Rotate Log: : Dispatch: : Screen Log: : Dispatch: : Syslog, Log: : Dispatch: : Tk

Example: Rotating Log File Appender • Keep 5 days of logfiles, then delete: log

Example: Rotating Log File Appender • Keep 5 days of logfiles, then delete: log 4 perl. category = WARN, Logfile log 4 perl. appender. Logfile = Log: : Dispatch: : File. Rotate log 4 perl. appender. Logfilename = test. log 4 perl. appender. Logfile. max = 5 log 4 perl. appender. Logfile. Date. Pattern = yyyy-MM-dd log 4 perl. appender. Logfile. TZ = PST log 4 perl. appender. Logfile. layout = Log: : Log 4 perl: : Layout: : Simple. Layout

Rotating Files • Rotating File Appender: – Log: : Dispatch: : File. Rotate –

Rotating Files • Rotating File Appender: – Log: : Dispatch: : File. Rotate – Single request pays for rotation – Rotation runs as particular user • External Rotators (e. g. newsyslog): – recreate flag makes sure file appender adjusts – recreate_check_interval saves on stat() calls

Layouts • Simple. Layout log 4 perl. appender. Screen =  Log: : Log

Layouts • Simple. Layout log 4 perl. appender. Screen = Log: : Log 4 perl: : Appender: : Screen log 4 perl. appender. Screen. layout = Simple. Layout $log->debug(“Sending Mail”); DEBUG – Sending Mail

Layouts • Pattern. Layout log 4 perl. appender. Logfile. layout =  Log: :

Layouts • Pattern. Layout log 4 perl. appender. Logfile. layout = Log: : Log 4 perl: : Layout: : Pattern. Layout log 4 perl. appender. Logfile. layout. Conversion. Pattern = %d %F{1}: %L> %m %n $log->debug(“Sending Mail”); 2004/10/17 18: 47: 25 l 4 ptest. pl: 25> Sending Mail

Layouts • Pattern. Layout %T stack trace %c Category of the logging event. %C

Layouts • Pattern. Layout %T stack trace %c Category of the logging event. %C Fully qualified package (or class) name of the caller %d Current date in yyyy/MM/dd hh: mm: ss format %F File where the logging event occurred %H Hostname %l calling method + file + line %L Line number within the file where the log statement was issued %m The message to be logged %M Method or function where the logging request was issued %n Newline (OS-independent) %p Priority of the logging event %P pid of the current process %r Number of milliseconds elapsed from program start %x The elements of the NDC stack %X{key} The entry 'key' of the MDC %% A literal percent (%) sign

Layouts • Still not enough? Write your own: log 4 perl. Pattern. Layout. cspec.

Layouts • Still not enough? Write your own: log 4 perl. Pattern. Layout. cspec. U = sub { return "UID $<" } … log 4 perl. appender. Logfile. layout = Log: : Log 4 perl: : Layout: : Pattern. Layout log 4 perl. appender. Logfile. layout. Conversion. Pattern = %d %U> %m %n

Speed

Speed

Benchmarks • 1 M/sec suppressed calls • 50 k/sec logged messages (memory appender) •

Benchmarks • 1 M/sec suppressed calls • 50 k/sec logged messages (memory appender) • No degradation with subcategories

Avoid Wasting Cycles for (@super_long_array) { $logger->debug("Element: $_n"); } if($logger->is_debug()) { for (@super_long_array) {

Avoid Wasting Cycles for (@super_long_array) { $logger->debug("Element: $_n"); } if($logger->is_debug()) { for (@super_long_array) { $logger->debug("Element: $_n"); } }

Dirty Tricks

Dirty Tricks

Resurrect in a Single File • The : resurrect target uncomments lines starting with

Resurrect in a Single File • The : resurrect target uncomments lines starting with ###l 4 p: use Log 4 perl qw(: easy : resurrect); sub foo { # … ###l 4 p DEBUG “foo was here”; }

Resurrect L 4 p in all Modules • The Log: : Log 4 perl:

Resurrect L 4 p in all Modules • The Log: : Log 4 perl: : Resurrector touches all subsequently loaded modules (experimental!): use Log 4 perl qw(: easy); use Log: : Log 4 perl: : Resurrector; use Foo: : Bar; # Deploy a module without requiring L 4 p at all! package Foo: : Bar; ###l 4 p use Log 4 perl qw(: easy); sub foo { ###l 4 p DEBUG “This will be resurrected!”; }

The Future

The Future

Wouldn’t it be nice … • … if all modules on CPAN had a

Wouldn’t it be nice … • … if all modules on CPAN had a standard logging interface?

Log 4 perl-enable a CPAN Module package Foo; sub foo { # … do

Log 4 perl-enable a CPAN Module package Foo; sub foo { # … do something } 1;

Log 4 perl-enable a CPAN Module package Foo; use Log: : Log 4 perl

Log 4 perl-enable a CPAN Module package Foo; use Log: : Log 4 perl qw(: easy); sub foo { # … do something DEBUG “Fooing $bar”; } 1;

… and voila, your CPAN module has a built-in remote.

… and voila, your CPAN module has a built-in remote.

Be Open • Let other people debug your module in a standard way.

Be Open • Let other people debug your module in a standard way.

Q&A

Q&A

Thank You! Log: : Log 4 perl Project Page (includes slides of this talk):

Thank You! Log: : Log 4 perl Project Page (includes slides of this talk): http: /log 4 perl. com Email me: Mike Schilli mschilli@yahoo-inc. com

Don’t forget to submit a Review! • Go to the OSCON schedule, click on

Don’t forget to submit a Review! • Go to the OSCON schedule, click on this talk and then ‘rate this talk’ • Thanks!

Bonus Slides

Bonus Slides

Advanced Trickery

Advanced Trickery

Infiltrating LWP • Ever wondered what LWP is doing behind the scenes? use LWP:

Infiltrating LWP • Ever wondered what LWP is doing behind the scenes? use LWP: : User. Agent; use HTTP: : Request: : Common; use Log: : Log 4 perl qw(: easy); Log: : Log 4 perl->easy_init($DEBUG); Log: : Log 4 perl->infiltrate_lwp(); my $ua = LWP: : User. Agent->new(); my $resp = $ua->request(GET "http: //www. yahoo. com");

Infiltrating LWP • Getting LWP to use Log 4 perl for logging: 2004/10/20 18:

Infiltrating LWP • Getting LWP to use Log 4 perl for logging: 2004/10/20 18: 36: 43 () 2004/10/20 18: 36: 43 GET http: //www. yahoo. com 2004/10/20 18: 36: 43 Not proxied 2004/10/20 18: 36: 43 () 2004/10/20 18: 36: 43 read 634 bytes 2004/10/20 18: 36: 43 read 4096 bytes … 2004/10/20 18: 36: 43 read 2488 bytes 2004/10/20 18: 36: 43 Simple response: OK

Pitfalls Beginner’s Pitfalls

Pitfalls Beginner’s Pitfalls

Beginner’s Pitfalls • Appender Additivity: – Once a lower level logger decides to fire,

Beginner’s Pitfalls • Appender Additivity: – Once a lower level logger decides to fire, it will forward the message to its appenders. – It will also forward the message unconditionally to all of its parent logger’s appenders.

Beginner’s Pitfalls • Appender Additivity (with dupes) log 4 perl. category = FATAL, Screen

Beginner’s Pitfalls • Appender Additivity (with dupes) log 4 perl. category = FATAL, Screen log 4 perl. category. Net. Amazon = DEBUG, Screen log 4 perl. appender. Screen = Log: : Log 4 perl: : Appender: : Screen log 4 perl. appender. Screen. layout = Simple. Layout package Net: : Amazon; DEBUG(“Debugging!”); DEBUG - Debugging!

Appender Additivity File Appender root FATAL Screen Appender Net: : Amazon DEBUG

Appender Additivity File Appender root FATAL Screen Appender Net: : Amazon DEBUG

Beginner’s Pitfalls • Appender Additivity (no dupes) log 4 perl. category = ERROR, Screen

Beginner’s Pitfalls • Appender Additivity (no dupes) log 4 perl. category = ERROR, Screen log 4 perl. category. Net. Amazon = DEBUG, Screen log 4 perl. additivity. Net. Amazon = 0 log 4 perl. appender. Screen = Log: : Log 4 perl: : Appender: : Screen log 4 perl. appender. Screen. layout = Simple. Layout package Net: : Amazon; DEBUG(“Debugging!”); DEBUG – Debugging! Q

Write Your Own Appender (1) package Color. Screen. Appender; our @ISA = qw(Log: :

Write Your Own Appender (1) package Color. Screen. Appender; our @ISA = qw(Log: : Log 4 perl: : Appender); use Term: : ANSIColor; sub new { my($class, %options) = @_; my $self = {%options, …}; bless $self, $class; } sub log { my($self, %params) = @_; print colored($params{message}, $self->{color}); }

Write Your Own Appender (2) log 4 perl. logger = INFO, Color. App log

Write Your Own Appender (2) log 4 perl. logger = INFO, Color. App log 4 perl. appender. Color. App=Color. Screen. Appender log 4 perl. appender. Color. App. color = red log 4 perl. appender. Color. App. layout = Simple. Layout

Filters • Last minute chance for Appenders to block • More expensive than Level/Category

Filters • Last minute chance for Appenders to block • More expensive than Level/Category blocking • Text/Level Match comes with L 4 p • Write your own custom filters

Filters log 4 perl. category = INFO, Screen log 4 perl. filter. My. Filter

Filters log 4 perl. category = INFO, Screen log 4 perl. filter. My. Filter = Log: : Log 4 perl: : Filter: : String. Match log 4 perl. filter. M 1. String. To. Match = let this through log 4 perl. appender. Screen = Log: : Log 4 perl: : Appender: : Screen log 4 perl. appender. Screen. Filter = My. Filter log 4 perl. appender. Screen. layout = Log: : Log 4 perl: : Layout: : Simple. Layout

Filters log 4 perl. filter. M 1 = Log: : Log 4 perl: :

Filters log 4 perl. filter. M 1 = Log: : Log 4 perl: : Filter: : String. Match log 4 perl. filter. M 1. String. To. Match = let this through log 4 perl. filter. M 1. Accept. On. Match = true log 4 perl. filter. M 1 = Log: : Log 4 perl: : Filter: : Level. Match log 4 perl. filter. M 1. Level. To. Match = INFO log 4 perl. filter. M 1. Accept. On. Match = true

Best Practices • Don’t provide program name, function name in the message. Use Layouts

Best Practices • Don’t provide program name, function name in the message. Use Layouts instead. • Log plenty. Don’t worry about space, use rotating log files for chatty output.

What you should log • • Program starting up, shutting down Function parameters Milestones

What you should log • • Program starting up, shutting down Function parameters Milestones in request processing Start/end of lenghty operations (e. g. DB access) • result of called function (logged in calling function)

What you shouldn’t log • Function/method names (although you want parameters) • Date •

What you shouldn’t log • Function/method names (although you want parameters) • Date • Process ID • … everything else provided by the layout

Error Handling use Log: : Log 4 perl qw(: easy); do_something or LOGDIE “Horrible

Error Handling use Log: : Log 4 perl qw(: easy); do_something or LOGDIE “Horrible error!”; • LOGCARP, LOGCLUCK, LOGCONFESS etc. also available.

Best Practices • Rolling out new L 4 p-enabled Modules package My: : Module;

Best Practices • Rolling out new L 4 p-enabled Modules package My: : Module; use Log: : Log 4 perl qw(: easy); sub new { # … } sub foo { DEBUG “I’m here”; # … } sub bar { INFO “Now I’m here”; # … } # Use w/o Log 4 perl use My: : Module; $o = My: : Module->new(); $o->foo(); # Log 4 perl enabled use My: : Module; use Log: : Log 4 perl qw(: easy); Log: : Log 4 perl->easy_init($DEBUG); $o = My: : Module->new(); $o->foo();

Gotchas • Avoid ‘append’ on NFS (creating lots of ‘read’ traffic) • Don’t put

Gotchas • Avoid ‘append’ on NFS (creating lots of ‘read’ traffic) • Don’t put expensive operations into the logger call which are executed before the logger decides • Permission issues with rotating file appenders

mod_perl • Init() in startup handler • Current limitation: One init(). • Use init_once()

mod_perl • Init() in startup handler • Current limitation: One init(). • Use init_once() if you’re not sure who inits first.

Combat overlapping Messages • Either live with it or – Use the Synchronized appender

Combat overlapping Messages • Either live with it or – Use the Synchronized appender – Use Appender. File. syswrite=1

Driving Log: : Log 4 perl further • Bug Fixes: Submit to log 4

Driving Log: : Log 4 perl further • Bug Fixes: Submit to log 4 perl-devel@sourceforge. net • New Features: Propose features or send patches • New Appenders: Release separately as a module in the Log: : Log 4 perl: : Appender: : xx namespace on CPAN • … or contact me: mschilli@yahoo-inc. com

Easy Mode Init with Files use Log: : Log 4 perl qw(: easy); Log:

Easy Mode Init with Files use Log: : Log 4 perl qw(: easy); Log: : Log 4 perl->easy_init({ level => $DEBUG, file => “>file. log”, category => “Bar: : Twix”, });

Multiline Layout Instead of 2007/04/04 23: 59: 01 This is a message with multiple

Multiline Layout Instead of 2007/04/04 23: 59: 01 This is a message with multiple lines get this: 2007/04/04 23: 59: 01 This is 2007/04/04 23: 59: 01 a message with 2007/04/04 23: 59: 01 multiple lines with Pattern. Layout: : Multiline: log 4 perl. appender. Logfile. layout = Log: : Log 4 perl: : Layout: : Pattern. Layout: : Multiline log 4 perl. appender. Logfile. layout. Conversion. Pattern = %d %m %n

Perl Hooks • Add parameters known at init() time log 4 perl. appender. Logfilename

Perl Hooks • Add parameters known at init() time log 4 perl. appender. Logfilename = sub { “mylog. $$. log” }

Loggers • Have a – category (e. g. “Net: : Amazon” ) – priority

Loggers • Have a – category (e. g. “Net: : Amazon” ) – priority (e. g. $DEBUG ) • Take a message (e. g. “Starting” )

Loggers • Pass on their message if – logging has been configured for •

Loggers • Pass on their message if – logging has been configured for • their category ( “Net: : Amazon”) or • a parent category ( “Net”, “” ) – and (!) the message priority (e. g. $DEBUG) is greater or equal than the configured log level (e. g. $DEBUG) for the category

Limit Throughput: Levels and Categories • Categories determine which parts of the system are

Limit Throughput: Levels and Categories • Categories determine which parts of the system are addressed. my $log = get_logger(“Net: : Amazon”); or simply package Net: : Amazon; DEBUG “…”; • Levels indicate the message priority. $log->debug(“Request sent ($bytes)”;

Displaying Logs with Chainsaw • Log 4 j features an XML layout and a

Displaying Logs with Chainsaw • Log 4 j features an XML layout and a socket appender • XML output is displayed in a nice GUI called Chainsaw • Log: : Log 4 perl also features an XML layout and a socket appender • … XML output is also displayed in a nice GUI called Chainsaw!

Displaying Logs with Chainsaw Log: : Log 4 perl enabled Perl Script Log: :

Displaying Logs with Chainsaw Log: : Log 4 perl enabled Perl Script Log: : Log 4 perl: : Layout: : XML Log: : Log 4 perl: : Appender: : Socket Java / log 4 j Program

Displaying Logs with Chainsaw

Displaying Logs with Chainsaw