Wie kann ich verhindern, dass cron mein Syslog auffüllt?


31

Ich habe ein Skript, das jede Minute ausgeführt werden muss. Das Problem ist, dass cron bei /var/log/syslogjeder Ausführung protokolliert . Am Ende sehe ich so etwas immer und immer wieder in /var/log/syslog:

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

Ich benutze Debian.

Meine Fragen sind: Kann ich cron auf irgendeine Weise mitteilen, dass diese Informationen nicht jedes Mal in syslog geschrieben werden?


1
Haben Sie eine Idee, wie Sie dies auf einer Busybox-Plattform tun können? Das Format von /etc/syslog.conf ist unterschiedlich ...
Mark Lakata

Antworten:


25

Sie können die Ausgabe von cron an eine separate Protokollfunktion senden und Ihrer /etc/syslog.confDatei Folgendes hinzufügen :

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

Denken Sie daran, es /var/log/cronzu Ihrem hinzuzufügen , /etc/logrotate.d/syslogum sicherzustellen, dass es gedreht wird, z

# /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
}

Vielen Dank für die Eingabe. Ich habe cron. * / Var / log / cron hinzugefügt und cron neu gestartet, aber die Nachrichten werden weiterhin in / var / log / syslog abgelegt, während / var / log / cron leer bleibt. nicht sicher, warum es nichts tut
user7321

1
oh man, episches Versagen meinerseits. Ich habe die syslog.conf bearbeitet und cron neu gestartet !! Kein Wunder, dass es nicht funktionieren würde. Ich hätte syslog neu starten sollen =)
user7321

1
Durch das Aktivieren von cron.log wird nicht verhindert, dass cron-Nachrichten in syslog geschrieben werden.
basic6

16

Okay,

Die Lösung meiner Frage war:

Veränderung

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

zu

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

innerhalb /etc/syslog.confund starten Sie syslog neu

Ich habe auch cron geschickt, /var/log/cron.logwie von Dave Cheney vorgeschlagen, und eine logrotate darauf geklebt. Mein Fix mit Daves Vorschlag ist optimal für meine Situation, weil:

  1. Es wird /var/log/syslognicht mit Cron-Nachrichten überfrachtet
  2. Ich erhalte immer noch Cron-Nachrichten (was für die Fehlerbehebung hilfreich ist)
  3. logrotate hält davon /var/log/cron.logab, zu groß zu werden.

7
Für diejenigen, die sich mit modernen Systemen beschäftigen, gibt es rsyslogin Debian 8.0 einen Jessie, der /etc/rsyslog.confbearbeitet werden muss. Übrigens sind die hinzuzufügenden Zeichenfolgen standardmäßig bereits vorhanden, Sie müssen sie nur auskommentieren (Zeile 63). Und /var/log/cron.logist schon in der /etc/logrotate.d/syslog, genau wie die Paketbetreuer diesen Thread gelesen haben.
TranslucentCloud

Ihre Frage war Is there any way I can tell cron not write this information to syslog every time. Das ist nicht die Antwort.
ntd

@TranslucentCloud Wollte nur hinzufügen, dass meine rsyslog-Konfiguration auf Ubuntu 14 LTS in /etc/rsyslog.d/50-default.conf war.
Johnny

8

Ändern Sie / 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"

Standardmäßig lautet die EXTRA_OPTS-Zeile "".


Diese IMO ist die richtige Lösung: Generieren Sie keinen Protokollsatz.
ntd

4

In Ubuntu 14.04.5 (und wahrscheinlich anderswo) gibt es rsyslogd anstelle von syslogd. TranslucentCloud hat dies mit Debian Jessie angedeutet, aber die gleiche Lösung (aber das Ändern von rsyslog.conf anstelle von syslogd.conf) scheint in Ubuntu nicht zu funktionieren.

Es sieht so aus, als ob die in /etc/rsyslog.d/50-default.conf festgelegten Werte Vorrang vor den in /etc/rsyslog.conf festgelegten Werten haben. Nehmen Sie die Änderungen dort vor und starten Sie dann rsyslog und cron neu. Andernfalls wird das Standardverhalten der Cron-Protokollierung in Syslog sowie der Cron-Protokollierung in Cronlog (jedoch nicht ausschließlich) beibehalten.

Erste Zeilen in meiner /etc/rsyslog.d/50-default.conf:

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

Und voila!


1
Sehr nette Antwort. Sie sollten sich jedoch auf neuere Fragen für die zukünftige Teilnahme an Stack Overflow konzentrieren, da diese sehr alt sind.
Magellan

3

Ich habe das nur auf eine andere Art gelöst, aber mein Ziel war etwas anders. Ich wollte die Cron-Protokolleinträge verwerfen, die beim Auslösen von atrun generiert wurden, damit meine Festplatten nicht alle 5 Minuten geweckt werden, sondern in den Ruhezustand versetzt werden.

Sie können festlegen, dass das Ziel eines Protokollereignisses in der Datei syslog.conf ein Shell-Befehl ist, indem Sie ihm die Pipe voranstellen. Deshalb habe ich grep verwendet, um diejenigen zu verwerfen, die ich nicht wollte. So:

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

Ich habe keine Nachforschungen angestellt, bin jedoch der Meinung, dass es möglich sein sollte, diese Protokolleinträge an ein anderes Ziel zu senden, wenn sie weiterhin benötigt werden.


3

Tatsächlich ist die 'beste' (man könnte behaupten) Lösung eine Kombination aus dem, was @ DaveCheney vorgeschlagen und was user7321 letztendlich getan hat , plus einer dritten Aktion, die ich empfehlen würde:

  1. Verhindern, dass syslogd Cron-bezogene Protokollnachrichten an / var / log / syslog anfügt
  2. Sicherstellen, dass Cron-Protokollnachrichten irgendwo protokolliert werden (insbesondere in / var / log / cron) + Sicherstellen der Protokollrotation für das Cron-Protokoll.
  3. Verhindern, dass syslogd auch Cron-bezogene Protokollnachrichten an / var / log / messages anfügt

In Ihrem /etc/syslog.confFall ändert sich durch die Kombination dieser Vorschläge etwa Folgendes:

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

in:

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

Und vergessen Sie nicht, sowohl den cron- als auch den syslogd-Dienst neu zu laden (oder neu zu starten), z. B .:

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

Hinweis: Dies funktioniert auch mit rsyslogd.


Die beste Lösung ist das, was @dfc vorgeschlagen hat, dh, Sie generieren das Protokoll nicht an erster Stelle.
ntd
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.