Séparer ou filtrer les logs de CRON

Avertissement
Dernière modification de cet article le 2011-04-08, le contenu pourrait être dépassé/obsolète.

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).

Syslog ou rsyslog

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

  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.

    • 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 ~).

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