如何防止cron填满系统日志?


31

我有一个脚本,需要每分钟执行一次。问题是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?


1
知道如何在Busybox平台上执行此操作吗?/etc/syslog.conf的格式不同...
Mark Lakata

Answers:


25

您可以将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
}

谢谢你的反馈。我添加了cron。* / var / log / cron并重新启动了cron,但是它继续将消息转储到/ var / log / syslog中,而将/ var / log / cron保留为空。不知道为什么它什么也没做
user7321 2009年

1
哦,老兄,我的史诗般的失败。我正在编辑syslog.conf并重新启动cron!难怪它不会起作用..我应该一直在重新启动syslog =)
user7321 2009年

1
启用cron.log不会阻止将cron消息写入syslog。
basic6

16

好,

我的问题的解决方案是:

更改

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

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

/etc/syslog.conf,然后重新启动系统日志

我还/var/log/cron.log按照Dave Cheney的建议将cron发送给了我,并在上面贴了logrotate。我对Daves建议的解决方案最适合我的情况,因为:

  1. /var/log/syslog避免被cron消息所困扰
  2. 我仍然收到cron消息(这对解决问题很有用)
  3. logrotate /var/log/cron.log不会太大。

7
对于那些关心现代系统的人,rsyslogDebian 8.0 Jessie中有一个,因此需要对其/etc/rsyslog.conf进行编辑。顺便说一下,默认情况下要添加的字符串已经存在,您只需要取消注释即可(第63行)。并且/var/log/cron.log已经在中/etc/logrotate.d/syslog,就像程序包维护人员已阅读此线程一样。
TranslucentCloud

您的问题是Is there any way I can tell cron not write this information to syslog every time。这不是答案。
ntd

@TranslucentCloud只是想补充一点,我在ubuntu 14 LTS上的rsyslog配置位于/etc/rsyslog.d/50-default.conf中。
约翰尼

8

更改/ 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行为“”


此IMO是正确的解决方案:不要生成日志记录。
ntd

4

在Ubuntu 14.04.5(可能还有其他地方)中,存在rsyslogd而不是syslogd。TranslucentCloud用Debian Jessie暗示了这一点,但是相同的解决方案(但是更改了rsyslog.conf而不是syslogd.conf)在Ubuntu中似乎不起作用。

看来/etc/rsyslog.d/50-default.conf中设置的值实际上要优先于/etc/rsyslog.conf中设置的内容,因此最好在此处进行更改,然后重新启动rsyslog和cron。否则,您仍然会遇到将cron记录到syslog的默认行为,以及将 cron记录到cronlog 的默认行为(但不是唯一的)。

我的/etc/rsyslog.d/50-default.conf中的前几行:

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

瞧!


1
很好的答案。就是说,您可能要专注于较新的问题,以便将来参与Stack Overflow,因为这是一个非常古老的问题。
麦哲伦

3

我只是以不同的方式解决了这个问题,但是我的目标略有不同。我想丢弃在启动atrun时生成的cron日志条目,以便我的硬盘驱动器可以休眠,而不是每5分钟唤醒一次。

您可以在syslog.conf中将日志事件的目标作为shell命令,方法是在其前面加上管道前缀,因此我使用grep丢弃了不需要的内容。所以:

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

我没有进行调查,但是我认为,如果仍然需要,可以将这些日志条目发送到另一个目标。


3

实际上,“最佳”解决方案(可以声称)是@DaveCheney 建议和user7321 最终完成的操作的结合,再加上我建议的第三项操作:

  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。


最好的解决方案是@dfc所建议的,即首先不要生成日志。
ntd
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.