Main menu:

Site search

Categories

septembre 2008
L M M J V S D
1234567
891011121314
15161718192021
22232425262728
2930  

Archive

Utiliser ses propres journaux d’événements

Sous Linux, les journaux d’événements (log en anglais) sont centralisés. il y a un daemon syslogd qui implémente le protocole syslog et gère les différents fichiers de log du système.
Ces fichiers sont très important pour résoudre des problèmes de fonctionnement ou de plantage.
Ma question du jour est: est-il possible d’utiliser cette facilité pour ses propres scripts ou programmes? Ce que je veux c’est un fichier .log qui ne soit utilisé que par mes programmes et qui soit situé, comme tous les autres fichiers de log du système, dans le répertoire /var/log.

Sans entrer dans les détails du fichier /etc/syslog.conf, il existe un certain nombre de fichiers standards comme par exemple (extrait du fichier /etc/syslog.conf):

kern.*				-/var/log/kern.log
mail.info			-/var/log/mail.info
news.crit			/var/log/news/news.crit

On peut voir par exemple que les événements concernant le mail sont écrits dans le fichier /var/log/mail.log. Le protocole syslog définit un certain nombres de facilités (facility). vous en voyez des exemples ici: mail, kern, lpr, user,news,… et huit priorités (priority) différentes:

  • Emerg (emergency)
  • Alert
  • Crit (critical)
  • Err (error)
  • Warning
  • Notice
  • Info
  • Debug

l’astérisque dans le couple facility.priority signifie que le fichier utilisé doit être celui qui est spécifié peu importe le niveau de priorité.

Ce qui nous intéresse, c’est qu’il existe huit facilités définissables par l’utilisateur ou par tout programme pour lequel il n’existerait pas de facilité par défaut dans syslog. Il s’agit des facilités local0 à local7. Autrement dit, il nous suffit d’ajouter dans le fichier /etc/syslog.conf une ligne du genre:

local0.*			-/var/log/michel.log

Je ne spécifie pas de priorité et le fichier dans lequel les événements sont écrits doit être /var/log/michel.log. le devant signifie que les messages ne doivent pas nécessairement être écrits directement dans le fichier mais que leur écriture peut être différée. Ceci n’a d’importance que pour des messages vraiment critiques qui en cas de plantage pourraient ne pas être écrits dans le fichier de log.

Ok, il reste une petite chose à faire: relancer le daemon syslogd pour que nos changements dans le fichier /etc/syslog.conf soit pris en compte:

$ sudo /etc/init.d/sysklogd restart

Maintenant nous sommes prêts à écrire nos messages dans le fichier de log /var/log/michel.log comme nous le voulions. Mais comment faire?

Dans un script shell, c’est facile, il existe une commande qui permet d’écrire dans un fichier de log:

$ logger -p local0.notice -t TEST Test de log

le switch -p spécifie le couple facilité.priorité. La priorité n’a pas d’importance pour nous.
le -t spécifie un tag que l’on peut afficher au début du message, le nom du programme qui a généré le message par exemple.
Le résultat de la commande se trouve donc dans le fichier /var/log/michel.log comme voulu:

$ more /var/log/michel.log
Sep 13 09:48:26 LinuxPC TEST: Test de log

Faire la même chose dans un programme écrit en python est à peine plus compliqué:

#!/usr/bin/env python

import syslog

syslog.openlog('TEST', 0, syslog.LOG_LOCAL0)
syslog.syslog(syslog.LOG_INFO,'Test de log en python')
syslog.closelog()

Je vous invite à jeter un oeil à la documentation du module syslog pour connaître les différentes constantes utilisables.

Voici la même chose en C++:

# include <string>
# include <syslog.h>

int main()
{
  std::string message = "TEST";
  openlog(message.c_str(), 0, LOG_LOCAL0);
  syslog(LOG_INFO,"Test de log en C++");
  closelog();
  return EXIT_SUCCESS;
}

Un conseil, abusez des fichiers de log dans vos scripts et vos programmes. Je vous assure que cela rend de grand services en cas de problème. C’est d’autant plus vrai si vous distribuez vos programmes parce que c’est toujours sur une autre machine que la vôtre que les plantages arrivent et vous serez content que votre client puisse vous envoyer le fichier de log de votre programme.