Comment puis-je empêcher cron de remplir mon syslog?

32

J'ai un script qui doit être exécuté chaque minute. Le problème est que cron se connecte à /var/log/syslogchaque exécution. Je finis par voir quelque chose comme ça répété encore et encore dans /var/log/syslog:

Jun 25 00:56:01 myhostname /USR/SBIN/CRON[1144]: (root) CMD (php /path/to/script.php > /dev/null)

J'utilise Debian.

Mes questions sont les suivantes: existe-t-il un moyen de dire à cron de ne pas écrire ces informations dans syslog à chaque fois?

user7321
la source
1
Une idée de comment faire cela sur une plateforme Busybox? Le format de /etc/syslog.conf est différent ...
Mark Lakata

Réponses:

25

Vous pouvez envoyer la sortie de cron à une fonction de journal distincte, ajoutez ce qui suit à votre /etc/syslog.conffichier:

# Log cron stuff
cron.*                                                  /var/log/cron

N'oubliez pas d'ajouter /var/log/cronà votre pour vous /etc/logrotate.d/syslogassurer qu'il tourne, par exemple

# /etc/logrotate.d/syslog
/var/log/messages /var/log/secure /var/log/maillog /var/log/spooler /var/log/boot.log /var/log/cron {
    sharedscripts
    postrotate
    /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
    endscript
}
Dave Cheney
la source
Merci de votre contribution. J'ai ajouté cron. * / Var / log / cron et redémarré cron mais il continue de vider les messages dans / var / log / syslog tout en laissant / var / log / cron vide. Je ne sais pas pourquoi il ne fait rien
user7321
1
oh mec, échec épique de ma part. J'étais en train de modifier syslog.conf et de redémarrer cron !! Pas étonnant que cela ne fonctionnerait pas. J'aurais dû redémarrer syslog =)
user7321
1
L'activation de cron.log n'empêche pas les messages cron d'être écrits dans syslog.
basic6
16

D'accord,

La solution à ma question était:

changement

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

à

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

à l'intérieur /etc/syslog.conf, puis redémarrez syslog

J'ai également envoyé un cron /var/log/cron.logcomme suggéré par Dave Cheney et y ai collé un logrotate. Ma solution avec la suggestion de Daves est optimale pour ma situation car:

  1. il empêche /var/log/syslogd'être encombré de messages cron
  2. Je reçois toujours des messages cron (ce qui est bien pour le dépannage)
  3. logrotate /var/log/cron.logne va pas trop loin .
user7321
la source
7
Pour ceux qui sont concernés par les systèmes modernes, il y en a rsyslogdans Debian 8.0 Jessie, c'est donc le /etc/rsyslog.confà éditer. Soit dit en passant, les chaînes à ajouter sont déjà là par défaut, il vous suffit de la décommenter (ligne 63). Et /var/log/cron.logest déjà dans le /etc/logrotate.d/syslog, tout comme les mainteneurs de paquets ont lu ce fil.
TranslucentCloud
Votre question était Is there any way I can tell cron not write this information to syslog every time. Ce n'est pas la réponse.
ntd
@TranslucentCloud Je voulais juste ajouter que ma configuration rsyslog sur ubuntu 14 LTS se trouvait dans /etc/rsyslog.d/50-default.conf.
Johnny
8

Modifiez / etc / default / cron

  # Or, to log standard messages, plus jobs with exit status != 0:
  # EXTRA_OPTS='-L 5' 
  #
  # For quick reference, the currently available log levels are:
  #   0   no logging (errors are logged regardless)
  #   1   log start of jobs
  #   2   log end of jobs
  #   4   log jobs with exit status != 0
  #   8   log the process identifier of child process (in all logs)
  #
  EXTRA_OPTS="-L 0"

Par défaut, la ligne EXTRA_OPTS est ""

dfc
la source
Cet IMO est la bonne solution: ne générez pas l'enregistrement de journal.
ntd
4

Dans Ubuntu 14.04.5 (et probablement ailleurs), il y a rsyslogd au lieu de syslogd. TranslucentCloud a fait allusion à cela avec Debian Jessie, mais la même solution (mais en changeant rsyslog.conf au lieu de syslogd.conf) ne semble pas fonctionner dans Ubuntu.

Il semble que les valeurs définies dans /etc/rsyslog.d/50-default.conf auront en fait priorité sur les éléments définis dans /etc/rsyslog.conf, il est donc préférable d'y apporter des modifications , puis de redémarrer rsyslog et cron. Sinon, vous vous retrouverez toujours avec le comportement par défaut de la journalisation cron vers syslog, plus la journalisation cron vers cronlog (mais pas exclusivement).

Deux premières lignes dans mon /etc/rsyslog.d/50-default.conf:

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

Et le tour est joué!

ericus
la source
1
Très belle réponse. Cela dit, vous voudrez peut-être vous concentrer sur de nouvelles questions pour une future participation à Stack Overflow car celle-ci est extrêmement ancienne.
Magellan
3

Je viens de résoudre cela d'une manière différente, mais mon objectif était légèrement différent. Je voulais supprimer les entrées du journal cron qui ont été générées lors du déclenchement de atrun afin que mes disques durs puissent dormir et ne pas être réveillés toutes les 5 minutes.

Vous pouvez avoir la cible d'un événement de journal dans syslog.conf comme une commande shell en le préfixant avec le canal, et j'ai donc utilisé grep pour jeter ceux que je ne voulais pas. Alors:

cron.*              | grep -v "(/usr/libexec/atrun)" >> /var/log/cron.log

Je n'ai pas enquêté, mais je pense qu'il devrait être possible d'envoyer ces entrées de journal à une autre cible si elles sont toujours souhaitées.

Parakleta
la source
3

En fait, la `` meilleure '' solution (on pourrait le prétendre) est une combinaison de ce que @DaveCheney a suggéré et de ce que user7321 a finalement fait , plus une troisième action que je recommanderais:

  1. Empêcher syslogd d'ajouter des messages de journal liés à cron à / var / log / syslog
  2. S'assurer que les messages du journal cron sont enregistrés quelque part (en particulier, dans / var / log / cron) + assurer la rotation du journal pour le journal cron.
  3. Empêcher syslogd d'ajouter également des messages de journal liés à cron à / var / log / messages

Dans votre /etc/syslog.conf, la combinaison de ces suggestions change quelque chose comme ceci:

*.*;cron,auth,authpriv.none                         -/var/log/syslog
auth,authpriv.none;daemon.none;mail,news.none       -/var/log/messages

dans:

cron.*                                              /var/log/cron.log
*.*;cron,auth,authpriv.none                         -/var/log/syslog
auth,authpriv.none;cron,daemon.none;mail,news.none  -/var/log/messages

Et n'oubliez pas de forcer le rechargement (ou de redémarrer) les services cron et syslogd, par exemple en utilisant:

/etc/init.d/syslogd force-reload
/etc/init.d/cron force-reload

Remarque: Cela fonctionne également avec rsyslogd.

einpoklum - réintégrer Monica
la source
La meilleure solution est ce que @dfc a suggéré, c'est-à-dire ne pas générer le journal en premier lieu.
ntd