El módulo Sys::Syslog facilita el envío de mensajes al daemon de syslog .
Para iniciar Sys::Syslog
llamamos a openlog
:
openlog($identity, $options, $facility
$identity
identifica el programa/servicio y será usado como prefijo
en cada entrada del log generada mediante la correspondiente llamada a
la función syslog
cons
Escribir el mensaje a la consola en caso de que no pueda enviarse a syslogd
ndelay
Abrir conexión con syslog inmediatamente en vez de esperar a que el primer mensaje haya sido
registrado. Normalmente la conexión se abre cuando se produce el primer mensaje de log.
pid
Incluir el PID en cada mensaje
Por ejemplo:
casiano@beowulf:~$ cat syslog.pl #!/usr/bin/perl -w use strict; use Sys::Syslog; die "usage: $0 facility/priority message\n" unless @ARGV; my ($facility, $priority) = split '/', shift; my $message = join ' ', @ARGV; openlog($0, "ndelay,pid", $facility) or die "fatal: can't open syslog: $!\n"; syslog($priority, "%s", $message); closelog();Al ejecutar este programa
casiano@beowulf:~$ perl syslog.pl LOCAL7/ERR 'ERRAR ES HUMANO'produce en el fichero
/var/log/syslog
la
siguiente entrada:
root@somemachine:/var/log# tail -1 syslog May 13 14:22:12 somemachine syslog.pl[15254]: ERRAR ES HUMANO
El lugar en el que acabe el mensaje depende de las reglas establecidas en el fichero de configuración. Por ejemplo, la siguiente ejecución del programa:
casiano@beowulf:~/src/perl/syslog$ perl syslog.pl local3/debug 'Tachan! tachan! BOOOOOOOOOOOOOOMMMM!!!'La advertencia queda en el fichero
/var/log/debug.log
:
root@beowulf:/var/log# tail -1 /var/log/debug May 13 15:57:48 beowulf syslog.pl[17092]: Tachan! tachan! BOOOOOOOOOOOOOOMMMM!!!Esto es asi por que en el fichero de configuración hay una línea de la forma:
root@beowulf:/var/log# sed -ne '41,43p' /etc/syslog.conf *.=debug;\ auth,authpriv.none;\ news.none;mail.none -/var/log/debug
La cual indica:
*
specifica que todos los mensajes del recurso/facility deben ser dirigidos al destino
=
es utilizado para restringir el logging a la clase especificada. Por ejemplo
*.=debug /var/log/debug.logredirige todos los mensajes de tipo
debug
de todos los fuentes
al fichero /var/log/debug.log
auth,authpriv.none;news.none;mail.none
indica que esta
regla no se aplica a los mensajes en
los servicios/facilities auth
, authpriv
, news
y mail
-
indica que no es necesario sincronizar el fichero
después de cada escritura en él
Después de llamar a openlog llamaremos a syslog para enviar mensajes de log al daemon:
$bytes = syslog($priority, $format, @args)
El argumento $format
funciona como en sprintf
con la diferencia de que el formato %m
se sustituye por el valor
de $!
y no requiere argumento.
casiano@beowulf:~/src/perl/syslog$ cat -n formats.pl 1 #!/usr/bin/perl -w 2 use strict; 3 use Sys::Syslog; 4 5 openlog($0, "ndelay,pid", 'LOCAL7') or die "fatal: can't open syslog: $!\n"; 6 open F, 'noexiste' or 7 syslog('err', "Can't open file %s: %m", 'noexiste'); 8 close(F); 9 closelog();Dará lugar a una entrada como:
root@somemachine:/var/log# tail -1 syslog May 13 14:49:29 somemachine formats.pl[15813]: Can't open file noexiste: \ No existe el fichero o el directorio
La función closelog cierra la conexión y devuelve cierto si se hizo con éxito.
La función setlogsock controla si la conexión con el daemon de syslog se hará via internet o via un socket UNIX local:
setlogsock($socktype)
El argumento $socktype
puede ser "inet"
o "unix"
(que es el valor por defecto). Esta función no es importada por defecto.
use Sys::Syslog qw{:DEAFULT setlogsock};
Casiano Rodríguez León