Log::Dispatch - Logging mit mehreren Ausgabezielen ganz einfach

Veröffentlicht von Thomas Fahle am (Permalink)

logs.jpg

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:

  1. debug
  2. info
  3. notice
  4. warning
  5. error
  6. critical
  7. alert
  8. 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:

 

Bildnachweis

LOGS, LOGS, LOGS, LOGS von waldopepper (Lizenz).

Weitere Posts