Log::Dispatch - Logging mit mehreren Ausgabezielen ganz einfach
Veröffentlicht von Thomas Fahle am (Permalink)
Log::Dispatch von Dave Rolsky erlaubt die Ausgabe von Log-Nachrichten an mehrere unterschiedliche Ausgabeziele.
Vom einfachen Logging in eine Datei, Speicherung in einer Datenbank-Tabelle, Syslog oder EventLog, Versenden einer E-Mail mit Logdatei als Attachment oder als Kurznachricht auf einen Twitter-Account ist so ziemlich alles möglich, was das Herz begehrt.
Loglevel
Über Loglevel (Prioritäten) läßt sich einfach steuern, ob der Dispatcher die ihm übergebenen Nachrichten tatsächlich weiter gibt oder einfach unterdrückt.
Log::Dispatch legt dazu ähnlich wie syslog acht Stufen für die Dringlichkeit (Priorität) der Log-Nachricht fest:
- debug
- info
- notice
- warning
- error
- critical
- alert
- emergency
Dispatcher erzeugen
#!/usr/bin/perl use strict; use warnings; use Log::Dispatch; my $ld = Log::Dispatch->new();
Ausgabeziele und Annahmeprioritäten festlegen
Ein Dispatcher kann mehrere Ausgabeziele bedienen.
Über Loglevel lässt sich hier festlegen, für welche Prioritäten das Ausgabeziel Nachrichten annimmt und loggt.
Ausgabe der Lognachrichten in eine Datei
use Log::Dispatch::File; $ld->add( Log::Dispatch::File->new( name => 'to_file', filename => 'logdatei.log', mode => 'append', min_level => 'debug', max_level => 'alert', ) );
Logging via syslogd
use Log::Dispatch::Syslog; $ld->add( Log::Dispatch::Syslog->new( name => 'to_syslog', # Muss in /etc/syslog.conf eingerichtet sein facility => 'local5', min_level => 'debug', max_level => 'emergency', ) );
Ausgabe der Lognachrichten auf dem Bildschirm (STDERR)
use Log::Dispatch::Screen; $ld->add( Log::Dispatch::Screen->new( name => 'screen', min_level => 'debug', stderr => 1, ) );
Log It
Nach so viel Vorbereitung ist das eigentliche Absetzen der Lognachrichten ganz einfach.
$ld->log( level => 'notice', message => "Starte $0\n" ); # Oder kuerzer $ld->notice( "Starte $0\n" ); $ld->log( level => 'emergency', message => "Die Huette brennt\n" ); # Oder kuerzer $ld->emergency( "Die Huette brennt\n" );
Im Programm selbst wird nur festgelegt, was mit welcher Priorität geloggt werden kann. Ob die Nachricht auch wirklich geloggt wird, hängt von der Konfiguration der Ziele ab.
Man kann also ein Programm mit sehr vielen Log-Anweisungen versehen, das hilft beim Debuggen. Für den laufenden Betrieb lässt sich die Geschwätzigkeit des Programm einfach durch Änderung der Konfiguration senken.
Log4perl und Log::Dispatch
Als Alternative bietet sich das erstklassige Log4perl von Michael Schilli an. Log4perl, die Perl Implementierung von log4j, nutzt übrigens Log::Dispatch recht intensiv.
Es schadet daher nichts, sich in Log::Dispatch einzuarbeiten, auch wenn man dann auf log4perl umsteigt.
Siehe auch:
- Log::Dispatch
- Dave Rolsky: Perl Modules for Exceptions, Logging, and Parameter Validation
- Log4perl - The log4perl project -- log4j for Perl
- Log::Dispatch::ApacheLog
- Log::Dispatch::Email
- Log::Dispatch::Email::MailSend
- Log::Dispatch::Email::MailSender
- Log::Dispatch::Email::MailSendmail
- Log::Dispatch::Email::MIMELite
- Log::Dispatch::File
- Log::Dispatch::FileRotate
- Log::Dispatch::File::Locked
- Log::Dispatch::Handle
- Log::Dispatch::Output
- Log::Dispatch::Screen
- Log::Dispatch::Syslog
- Log::Dispatch::Win32EventLog
- Log::Dispatch::FileRotate
- Log::Dispatch::Twitter