web-dev-qa-db-ja.com

cronがsyslogをいっぱいにしないようにするにはどうすればよいですか?

毎分実行する必要があるスクリプトがあります。問題は、cronが実行されるたびに/var/log/syslogにログを記録することです。このようなことが/var/log/syslogで何度も繰り返されるようになります。

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

私はDebianを使用しています。

私の質問は、cronが毎回この情報をsyslogに書き込まないようにする方法はありますか?

34
user7321

OK、

私の質問に対する解決策は:

変化する

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

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

/etc/syslog.conf内で、syslogを再起動します

また、Dave Cheneyの提案に従って/var/log/cron.logにcronが送信され、logrotateがスタックされました。 Davesの提案による私の修正は、次の理由で私の状況に最適です。

  1. /var/log/syslogがcronメッセージで乱雑にならないようにします
  2. それでもcronメッセージが表示されます(トラブルシューティングに最適です)
  3. logrotateは、/var/log/cron.logが大きくなりすぎないようにします。
17
user7321

Cronの出力を別のログ機能に送信するには、/etc/syslog.confファイルに以下を追加します。

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

/var/log/cron/etc/logrotate.d/syslogに追加して、確実に回転するようにしてください。

# /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
}
25
Dave Cheney

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

デフォルトでは、EXTRA_OPTS行は ""です

10
dfc

Ubuntu 14.04.5(およびおそらく他の場所)では、syslogdの代わりにrsyslogdがあります。 TranslucentCloudは、Debian Jessieでこれをほのめかしましたが、同じソリューション(syslogd.confの代わりにrsyslog.confを変更する)はUbuntuでは機能しないようです。

/etc/rsyslog.d/50-default.confに設定された値は、実際には/etc/rsyslog.confに設定されたものよりも優先されるようです。そのため、変更を行う方が適切ですthereそして次にrsyslogとcronを再起動します。それ以外の場合、syslogへのcronロギングのデフォルトの動作、つまりplus cronロギングからcronlogへのロギング(ただし、排他的ではない)になります。

/etc/rsyslog.d/50-default.confの最初の数行:

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

そして出来上がり!

4
ericus

実際、「最良の」(主張できる)ソリューションは、@ DaveCheney 推奨 とuser7321 最終的に の組み合わせと、私が推奨する3番目のアクションです。

  1. Syslogdがcron関連のログメッセージを/ var/log/syslogに追加しないようにする
  2. Cronログメッセージがどこかに(具体的には、/ var/log/cronに)ログに記録されるようにする+ cronログのログローテーションを確認する。
  3. Syslogdがcron関連のログメッセージを/ var/log/messagesにも追加しないようにする

あなたの/etc/syslog.conf、これらの提案を組み合わせると、次のように変わります。

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

に:

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

また、cronサービスとsyslogdサービスの両方を強制的にリロード(または再起動)することを忘れないでください。使用:

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

注:これはrsyslogdでも機能します。

3
einpoklum

私はこれを別の方法で解決しましたが、私の目的は少し異なりました。ハードドライブがスリープ状態になり、5分ごとに起動しないように、atrunが実行されたときに生成されたcronログエントリを破棄したいと思いました。

Syslog.confのログイベントのターゲットにパイプをプレフィックスとして付けることで、シェルコマンドにすることができます。そのため、grepを使用して、不要なものを破棄しました。そう:

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

調査はしていませんが、必要な場合は、これらのログエントリを別のターゲットに送信できるはずです。

3
Parakleta