Rsyslog : Dériver les messages syslog dans un fichier particulier

Depuis pas mal de temps, je me casse les dents sur la dérivation des logs envoyés au démon rsyslog, utilisés pas défaut dans Ubuntu. En effet, j’ai installé un tvheadend sur mon serveur / media center pour avoir à la TV dans tous mes XBMC/Kodi, et le mode debug est un peu trop verbeux à mon goût.

La configuration de base de rsyslog est fait par défaut dans « /etc/rsyslog.d/50-default.conf ». Pour qu’un fichier particulier soit traité en premier, comme dans Apache, il faut en créer un nouveau.

Par exemple, j’ai créer les fichiers suivants :

[19:54 user@home ~] > ll /etc/rsyslog.d/*
-rw-r--r-- 1 root root  483 Apr  9 21:40 /etc/rsyslog.d/10-tvheadend.conf
-rw-r--r-- 1 root root  465 Apr  9 21:40 /etc/rsyslog.d/11-dhcpd.conf
-rw-r--r-- 1 root root  469 Apr  9 21:50 /etc/rsyslog.d/12-postfix.conf
-rw-r--r-- 1 root root  311 Mar 17  2012 /etc/rsyslog.d/20-ufw.conf
-rw-r--r-- 1 root root 1.7K Apr  9 21:52 /etc/rsyslog.d/50-default.conf

Ces fichiers contiennent les dérivations suivantes :

[19:54 user@home ~] > cat /etc/rsyslog.d/10-tvheadend.conf
# Put tvheadend log in a specific log file
if $programname == 'tvheadend' then /var/log/tvheadend/tvheadend.log
& stop

[19:54 user@home ~] > cat /etc/rsyslog.d/11-dhcpd.conf
# Put isc-dhcpd-server log in a specific log file
if $programname == 'tvheadend' then /var/log/dhpcd.log
& stop

[19:54 user@home ~] > cat /etc/rsyslog.d/12-postfix.conf
# Put postfix log in a specific log file
if $programname == 'tvheadend' then /var/log/postfix.log
& stop

Il faut ensuite simplement reloader/restarter le service rsyslog pour prendre en compte ces changements, et vérifiez que vos fichiers sont bien crées (il peut subsister des problèmes de droits, surtout lorsque vous avez créer un dossier spécifique comme dans le cas de tvheadend).

A noter qu’il existe beaucoup d’options pour filtrer par programname, severity, ou de manière plus puissante par regex. Dans le cas ou vous souhaiteriez faire ceci, RFTM !

Ensuite, il ne faut oublier de configurer la rotation des logs (dans mon cas, j’ajoute un restart du process, car je n’ai pas de ‘status‘ pour le démon tvheadend dans mon init.d) :

[20:05 user@home ~] > cat /etc/logrotate.d/tvheadend
/var/log/tvheadend/*.log {
        daily
        missingok
        rotate 7
        compress
        delaycompress
        notifempty
        create 640 syslog adm
        sharedscripts
        postrotate
                /etc/init.d/tvheadend restart
        endscript
}

Puis forcer la rotation (-f) ou débuguer (-d)

[20:09 user@home ~] > sudo logrotate -d /etc/logrotate.conf
reading config file /etc/logrotate.conf
[...]
reading config file tvheadend
[...]

rotating pattern: /var/log/tvheadend/*.log  after 1 days (7 rotations)
empty log files are not rotated, old logs are removed
switching euid to 0 and egid to 104
considering log /var/log/tvheadend/tvheadend.log
  log does not need rotating
not running postrotate script, since no logs were rotated
switching euid to 0 and egid to 0

Vous trouvez alors la rotation des logs :

[20:11 user@home ~] > ll /var/log/tvheadend/
 
-rw-r----- 1 syslog adm  12K Apr 11 20:11 tvheadend.log
-rw-r----- 1 syslog adm  48K Apr 11 09:50 tvheadend.log.1

Bon amusement !