如何限制我的系统日志大小?

我用我妈妈的电脑运行着Ubuntu 12.04 LTS。一直都很正常,但突然间syslog开始填满了。我刚刚删除了一个大小为400GB的/var/log/syslog文件。是的,就是千兆字节。
虽然我相信其中可能有一些有用的信息,但我不确定要筛选400GB的信息是否明智。更令人惊讶的是,这发生在8个小时内——中午左右我运行了df命令,从那时到现在,她的硬盘使用量从接近70%增加到100%,增加了30%。
是什么原因导致这种情况,我该如何解决?
编辑: 看起来USB设备是罪魁祸首。
Sep  8 08:52:10 pamela-desktop kernel: [ 6198.157829] usb 1-3: usbfs: process 1500 (demond_nscan) did not claim interface 3 before use
Sep  8 08:52:10 pamela-desktop kernel: [ 6198.157836] usb 1-3: usbfs: process 1500 (demond_nscan) did not claim interface 3 before use
Sep  8 08:52:10 pamela-desktop kernel: [ 6198.157842] usb 1-3: usbfs: process 1500 (demond_nscan) did not claim interface 3 before use
Sep  8 08:52:10 pamela-desktop kernel: [ 6198.157849] usb 1-3: usbfs: process 1500 (demond_nscan) did not claim interface 3 before use
Sep  8 08:52:10 pamela-desktop kernel: [ 6198.157857] usb 1-3: usbfs: process 1500 (demond_nscan) did not claim interface 3 before use
Sep  8 08:52:10 pamela-desktop kernel: [ 6198.157863] usb 1-3: usbfs: process 1500 (demond_nscan) did not claim interface 3 before use
Sep  8 08:52:10 pamela-desktop kernel: [ 6198.157870] usb 1-3: usbfs: process 1500 (demond_nscan) did not claim interface 3 before use
Sep  8 08:52:10 pamela-desktop kernel: [ 6198.157877] usb 1-3: usbfs: process 1500 (demond_nscan) did not claim interface 3 before use
Sep  8 08:52:10 pamela-desktop kernel: [ 6198.157884] usb 1-3: usbfs: process 1500 (demond_nscan) did not claim interface 3 before use
Sep  8 08:52:10 pamela-desktop kernel: [ 6198.157891] usb 1-3: usbfs: process 1500 (demond_nscan) did not claim interface 3 before use

4我认为,与其限制大小,你应该试着弄清楚是什么填满了它。应该有很多重复的消息,请尝试运行 tail -n20 /var/log/syslog 来查看最后20行。 - mikewhatever
我在删除文件之前尝试过那个 - 没有看到重复的情况,但我会再检查一下。 - Wayne Werner
所以看起来问题是“demond_nscan”,在谷歌上我找不到任何相关信息。nscan是一个端口扫描应用程序,所以这可能是某人对它的修改(但这只是我的猜测)。如果这不是你明确要运行的应用程序,我建议尝试找到可执行文件(类似于find / -iname demond_nscan),并将其重命名/更改权限,使其无法执行。(这样,如果它实际上对某些东西很重要,你就没有丢失它,而如果它被其他东西启动,你可能会注意到。另外,检查一下crontab -l?) - Steve Kroon
1demond_nscan看起来与雷马克扫描驱动程序有关。 - Wayne Werner
3个回答

限制logrotate的大小

打开/etc/logrotate.d/rsyslog配置文件

sudo nano /etc/logrotate.d/rsyslog

文件看起来像这样
/var/log/syslog
{
    rotate 7
    daily
    missingok
    notifempty
    delaycompress
    compress
    postrotate
        /usr/lib/rsyslog/rsyslog-rotate
    endscript
}
....
...

在括号中添加例如size 100k。之后它应该看起来像这样:
/var/log/syslog
{
    rotate 7
    size 100k
    daily
    missingok
    notifempty
    delaycompress
    compress
    postrotate
        /usr/lib/rsyslog/rsyslog-rotate
    endscript
}

请注意,这只限制了旋转文件的大小,而不是实际的系统日志文件。 保存文件。下次logrotate计划任务启动时,它将限制旋转日志的大小。
限制当前系统日志的大小
要限制/var/log/syslog的大小,您需要编辑/etc/rsyslog.d/50-default.conf,并设置一个固定的日志大小。
通过更改/etc/rsyslog.d/50-default.conf中的以下行来添加或修改此设置:
.*;auth,authpriv.none       -/var/log/syslog

这是rsyslog手册的摘录:
输出通道通过$outchannel指令进行定义。其语法如下: $outchannel 名称,文件名,最大大小,达到最大大小时的操作
名称是输出通道的名称(不是文件名),文件名是要写入的文件名,最大大小是允许的最大大小,达到最大大小时执行的命令。该命令始终只有一个参数。二进制部分是action-on-max-size中第一个空格之前的部分,其参数是该空格之后的所有内容。请注意,在将日志消息写入文件之前,会先查询最大大小。因此,请确保将此限制设置得相对较低,以便任何消息都能适应其中。对于当前版本,将其设置为比预期值低1k是有帮助的。最大大小必须始终以字节为单位指定-在开发的这个阶段没有特殊符号(如1k、1m等)。请记住,$outchannel只是定义了一个名为“名称”的通道,它并不激活它。要激活它,您必须使用选择器行(见下文)。该选择器行包括通道名称加上其前面的$符号。一个示例可能是:. :omfile:$mychannel。目前,输出通道主要提供了限制输出文件大小的功能。为此,请指定最大大小。当达到此大小时,rsyslogd将执行action-on-max-size命令,然后重新打开文件并重试。该命令应该是类似于日志轮转脚本或类似的东西。如果没有action-on-max-size命令或命令未解决问题,则文件将被关闭,并且不会被rsyslogd重新打开(除非通过huping)。当我们首次遇到超过2GB的文件时,这种逻辑被集成进来,因为它可能导致rsyslogd崩溃。在这种情况下,停止向单个文件写入更加合适。与此同时,rsyslogd已经修复以支持超过2GB的文件,但显然只能在支持此功能的文件系统和操作系统版本上实现。因此,强制执行2GB的文件大小限制仍然有意义。
在这里,最大尺寸是1MB,请在*.*; ...行之前添加这一行。
$outchannel mysyslog,/var/log/syslog,1048576

*.*; ... 这一行改为
*.*;auth,authpriv.none  :omfile:$mysyslog

重新启动rsyslogd以太网。
sudo systemctl restart  rsyslog.service

或者

sudo service rsyslog restart

要查看rsyslog的状态,请输入命令
systemctl status rsyslog.service  

你应该找出导致大量消息的原因,如果你解决了这个问题,那么你就解决了大型日志文件的问题。
然而,在那之前,你可以根据以下其中一个选择进行日志轮转:
  • 时间(例如,每天轮转一次)
  • 大小(例如,在文件达到10MB时轮转)
系统默认已经设置了这项功能:/etc/logrotate.d/rsyslog
 /var/log/syslog
{
    rotate 7
    daily
    missingok
    notifempty
    delaycompress
    compress
    postrotate
            reload rsyslog >/dev/null 2>&1 || true
    endscript
 }

从这个可以看出,它将每天旋转/var/log/syslog文件,并保留7个旋转后的文件副本。
您可以更改为按大小限制旋转,比如1mb,或者减少存储的副本数量。
警告:这不会修复您问题的根本原因,但它会给您一些时间,因为它会阻止文件系统填满。
来源:/etc/logrotate.d/rsyslog 来源:man logrotate

5这不会限制实际syslog的大小! - abu_bua

我曾经遇到过与Lexmark Pro915打印机相同的问题长达两周之久。我采取了两个措施,现在它正常工作。首先,我重新安装了驱动程序(我认为这并没有起到太大的帮助)。其次,我拆下了我使用的USB延长线,因为总长度接近15英尺,可能不完全兼容。我怀疑Lexmark针对Linux系统的驱动程序可能会检测到一个质量较差或者时序不佳的信号,并且每天要向您报告100亿次。尝试改善您的连接方式吧。
Logrotate和类似的解决方案对我没有帮助。Kern.log和syslog一起每天记录超过1TB的数据!如果您能将Logrotate设置为每12分钟运行一次,可能会有所帮助。

同意。在我看来,每天使用1TB(或者在我的情况下是几个小时)的日志轮转可能会损坏你的固态硬盘...在我的情况下,我知道发生了什么,但却无能为力...每次电脑锁定时,如果VLC正在运行,它就会开始抱怨... - ntg