09 Avr 2011

Séparer ou filtrer les logs de CRON

Category: Administration de serveur,Tutorielscduv @ 01:28

Il est, à mon avis, utile d'avoir tous les logs des différentes cronjobs dans un fichier spécifique. Voici comment faire (sous Debian avec rsyslog).

Pré-requis

Syslog ou rsyslog

Notes

Soit "/var/log/cron.log", notre fichier dédié au logs des cron.

Etapes

  1. Envoyer ce qui vient de CRON dans notre fichier dédié.

    Editer le fichier "/etc/rsyslog.conf" pour y rajouter la ligne suivante :

    cron.*                -/var/log/cron.log

    Elle indique que, les messages provenant de la facilité (facility) CRON (cron.*) doivent, quelque soit le niveau de gravité (severity) (cron.*), aller dans le fichier "/var/log/cron.log".

  2. Sauf qu'il existe, d'autres messages générés par les cronjobs mais ne provenant pas de la facilité CRON

    En effet, des ouvertures/fermetures de sessions sont faites pour pouvoir exécuter la tâche planifiée, or ces dernières proviennent de la facilité SECURITY et non pas de CRON.

    Si l'on veut les rediriger vers notre fichier dédié, créer un fichier "/etc/rsyslog.d/20-cron.conf" contenant les lignes suivantes :

    # Intercepte les log venant de SECURITY de gravité INFO pour le SYSLOG CRON[...]
    if $syslogfacility-text == 'security' and $syslogseverity-text == 'info' and $syslogtag regexp 'CRON[0-9*]:' and ($msg contains 'pam_unix(cron:session): session opened for user ' or $msg contains 'pam_unix(cron:session): session closed for user ') then /var/log/cron.log

    La deuxième ligne consiste en de simples vérifications sur :

    • Le nom de la facilité ($syslogfacility-text) (« Est-ce "security" ? »)
    • La sévérité ($syslogseverity-text) (« Est-ce "info" ? »)
    • Le tag ($syslogtag) (« Commence-t-il par CRON avec quelques chiffres entre crochets ? »)
    • Le contenu du message ($msg) (« Parle-t-il d'une ouverture ou d'une fermeture de session ? »)

    Et demande d'envoyer les messages satisfaisant les critères vers le fichier "/var/log/cron.log".

  3. Vous remarquerez peut-être que ces modifications n'empêchent pas les messages générés par CRON d'aller se retrouver ailleurs, dans d'autres fichiers de log, comme "/var/log/syslog" par exemple.

    Si vous voulez qu'ils aillent exclusivement dans le fichier dédié il faut dire au logiciel rsyslog (dans mon exemple) de ne pas les envoyer ailleurs.
    Editer le fichier "/etc/rsyslog.conf" et chercher les lignes désignant les fichiers (ou autre types de destinations de log) dans lesquels vous ne voulez plus que les messages du CRON aillent. Exemple :

    *.*;auth,authpriv     -/var/log/syslog

    Que l'on transforme en :

    *.*;auth,authpriv,cron.none     -/var/log/syslog

    Rajouter cron.none à la droite du point-virgule (";") ignore les messages provenant de la facilité CRON (cron.none) et ayant n'importe quel niveau de sévérité (cron.none), ainsi ils n'iront pas dans le fichier "/var/log/syslog".

    Rouvrez le fichier "/etc/rsyslog.d/20-cron.conf" créé précédemment et ajouter y la ligne suivante après celle du point 2. :

    if $syslogfacility-text == 'security' and $syslogseverity-text == 'info' and $syslogtag regexp 'CRON[0-9*]:' and ($msg contains 'pam_unix(cron:session): session opened for user ' or $msg contains 'pam_unix(cron:session): session closed for user ') then ~

    Il s'agit de la même suite de vérifications (sur facilité, sévérité, tag et contenu du message) qu'auparavant, mais l'action, ici, est d'oublier le message (then ~).

Conclusion

Tout ce qui concerne l'exécution des cronjobs se retrouvera dans le fichier "/var/log/cron.log" et nul part ailleurs.

Étiquettes : ,

Laisser une réponse