Jak mogę zapobiec wypełnianiu mojego syslogu przez crona?

32

Mam skrypt, który należy wykonywać co minutę. Problem polega na tym, że cron loguje się przy /var/log/syslogkażdym uruchomieniu. W końcu widzę coś takiego powtarzającego się w kółko /var/log/syslog:

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

Używam Debiana.

Moje pytania brzmią: czy jest jakiś sposób, aby powiedzieć cronowi, że za każdym razem nie zapisuje tych informacji w syslog?

użytkownik7321
źródło
1
Masz pomysł, jak to zrobić na platformie Busybox? Format pliku /etc/syslog.conf jest inny ...
Mark Lakata

Odpowiedzi:

25

Możesz wysłać dane wyjściowe crona do osobnego narzędzia do rejestrowania i dodać do /etc/syslog.confpliku:

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

Pamiętaj, aby dodać /var/log/crondo swojego, /etc/logrotate.d/syslogaby upewnić się, że zostanie obrócony, np

# /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
źródło
Dziękuję za wkład. Dodałem cron. * / Var / log / cron i zrestartowałem crona, ale nadal zrzuca wiadomości do / var / log / syslog, pozostawiając pusty / var / log / cron. nie jestem pewien, dlaczego nic nie robi
user7321
1
o rany, epicka porażka z mojej strony. Edytowałem syslog.conf i restartowałem crona !! Nic dziwnego, że to nie zadziałało. Powinienem był ponownie uruchomić syslog =)
user7321,
1
Włączenie cron.log nie zapobiega zapisywaniu wiadomości cron w syslog.
basic6
16

Dobrze,

Rozwiązaniem mojego pytania było:

zmiana

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

do

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

w ciągu /etc/syslog.conf a następnie ponownie uruchom syslog

Mam też crona wysłanego na polecenie /var/log/cron.logDave'a Cheneya i nakleiłem na niego logrotat. Moja poprawka z sugestią Dave'a jest optymalna dla mojej sytuacji, ponieważ:

  1. zapobiega /var/log/syslogzapełnianiu się wiadomościami cron
  2. Nadal otrzymuję wiadomości CRON (co jest przydatne do rozwiązywania problemów)
  3. logrotate zapobiega /var/log/cron.logzbyt dużemu wzrostowi .
użytkownik7321
źródło
7
Dla zainteresowanych nowoczesnymi systemami dostępna jest rsyslogJessie w Debianie 8.0, więc należy /etc/rsyslog.confją edytować. Nawiasem mówiąc, ciągi, które należy dodać, są już domyślnie dostępne, wystarczy je odkomentować (wiersz 63). I /var/log/cron.logjest już w /etc/logrotate.d/syslog, tak jak opiekunowie pakietów przeczytali ten wątek.
TranslucentCloud
Twoje pytanie Is there any way I can tell cron not write this information to syslog every time. To nie jest odpowiedź.
ntd
@TranslucentCloud Chciałem tylko dodać, że moja konfiguracja rsyslog na Ubuntu 14 LTS była w /etc/rsyslog.d/50-default.conf.
Johnny
8

Zmień / 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"

Domyślnie wiersz EXTRA_OPTS to „”

dfc
źródło
To IMO jest poprawnym rozwiązaniem: nie generuj rekordu dziennika.
ntd
4

W Ubuntu 14.04.5 (i prawdopodobnie gdzie indziej) zamiast syslogd znajduje się rsyslogd. TranslucentCloud wspomniał o tym w Debian Jessie, ale to samo rozwiązanie (ale zmiana rsyslog.conf zamiast syslogd.conf) nie działa w Ubuntu.

Wygląda na to, że wartości ustawione w /etc/rsyslog.d/50-default.conf faktycznie będą miały pierwszeństwo przed elementami ustawionymi w /etc/rsyslog.conf, więc lepiej wprowadzić tam zmiany , a następnie zrestartować rsyslog i cron. W przeciwnym razie nadal będziesz mieć domyślne zachowanie logowania cron do syslog, plus rejestrowanie cron do cronlog (ale nie wyłącznie).

Pierwsze kilka linii w moim /etc/rsyslog.d/50-default.conf:

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

I voila!

ericus
źródło
1
Bardzo miła odpowiedź. To powiedziawszy, możesz chcieć skupić się na nowszych pytaniach dotyczących przyszłego udziału w przepełnieniu stosu, ponieważ to jest bardzo stare.
Magellan,
3

Właśnie rozwiązałem to w inny sposób, ale mój cel był nieco inny. Chciałem odrzucić wpisy dziennika cron, które zostały wygenerowane po uruchomieniu atrun, aby moje dyski twarde mogły spać i nie budzić się co 5 minut.

Możesz ustawić cel zdarzenia dziennika w syslog.conf jako polecenie powłoki, poprzedzając je potokiem, więc użyłem grep, aby wyrzucić te, których nie chciałem. Więc:

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

Nie badałem, ale uważam, że powinno być możliwe wysłanie tych wpisów do innego celu, jeśli nadal są potrzebne.

Parakleta
źródło
3

W rzeczywistości „najlepsze” (można by twierdzić) rozwiązanie jest kombinacją tego, co sugerował @DaveCheney i tego, co w końcu zrobił użytkownik 7321 , a także trzeciego działania, które poleciłbym:

  1. Zapobieganie dołączaniu przez syslogd komunikatów dziennika związanych z cronem do / var / log / syslog
  2. Dopilnowanie, aby komunikaty dziennika cron były gdzieś logowane (w szczególności w / var / log / cron) + zapewnienie rotacji dziennika dla dziennika cron.
  3. Zapobieganie dołączaniu przez syslogd komunikatów dziennika związanych z cronem do / var / log / messages

W Twojej /etc/syslog.confkombinacji tych sugestii zmienia się coś takiego:

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

w:

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

I nie zapomnij wymusić ponownego załadowania (lub zrestartowania) usług cron i syslogd, np. Przy użyciu:

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

Uwaga: Działa to również z rsyslogd.

einpoklum - przywróć Monikę
źródło
Najlepszym rozwiązaniem jest to, co sugeruje @dfc, tzn. Nie generuj dziennika w pierwszej kolejności.
ntd