/var/log/syslog 的大小无限增长。

我的电脑上装有Ubuntu的磁盘大小为115GB。
当磁盘已满114.7GB时。
我开始随处删除一些文件,以释放大约5GB的空间。
但是我注意到磁盘又填满了114GB。我以为这是一些缓存或交换文件的原因,所以没有太在意,并继续通过将一些媒体文件移出磁盘来释放大约40GB的空间。
大约一个小时后,我收到了磁盘再次满的通知!整整40GB!全部消失了!
所以我将问题调试到了/var/log/syslog文件上,最初它肯定小于20GB。我知道这是因为在清理内存之前,/var文件夹只有17GB。
现在,/var/log/syslog文件的大小是55.9GB!
有人能够解释这个异常吗? 这是一个bug吗? 还是我受到了某种恶意软件或病毒的影响?

你有没有碰巧在使用VPN? - Kalamalka Kid
1这取决于您的系统中有哪些应用程序和其他运行的内容。您可以清理一些位于/var/log(递归)下的旧/归档条目,这些条目的文件扩展名为*.gz。但是您应该留意一下在/var/log目录下为什么有些日志增长得如此之快。 - Ashu
阿舒是对的...也许你可以编辑你的问题,告诉我们日志文件中哪些条目导致它快速增长。 - Kalamalka Kid
1好的,去/var/syslog里看看,看看是什么在填满它! - psusi
1+1 ... 你可能想要在终端中使用类似 tail -f /var/log/syslog 的命令(以避免将如此大的文件加载到文本编辑器中)。 - steeldriver
@KalamalkaKid 是的,我是的,但我已经使用它很长时间了。 - ant_1618
1是的,我检查了文件,发现是wifi监视器mon0出错了。真不敢相信它竟然洪水般地占用了50GB的空间。同样的错误,哈哈。 - ant_1618
我之所以问这个问题是因为蛮力攻击通常会导致大量的日志文件,但这些通常是不同的日志。不过看起来你找到了罪魁祸首。你可能想要提出一个关于wifi监视器mon0问题的新问题,看看如何解决它。 - Kalamalka Kid
我看到了@KalamalkaKid。是的,你说得对,必须看看mon0会导致什么。谢谢 :) - ant_1618
2可能是重复的问题:非常大的日志文件,我该怎么办? - karel
一种可能导致系统日志快速填满磁盘空间的原因是nvidia驱动程序和VLC播放器的组合。请参考:https://unix.stackexchange.com/questions/561565/ - Attila Csipak
6个回答

这种无限增长通常是由于同一来源的一个或多个错误的重复记录而发生的。 在我的情况下,这是由于来自wifi监控接口mon0的连接错误不断报告所致,我用它来监控我的wifi流量。 还有其他接口(如VPN中的tun0)也报告了类似溢出的错误。
我通过清除/var/log/syslog文件解决了我的问题。
解决这个错误的方法:
  1. 您需要找到此错误的来源并停止其产生任何进一步的日志溢出
  2. 然后清除var/log/syslog文件
您可能在执行相同操作时遇到的问题:
  1. 无法打开var/log/syslog由于文件过大,任何编辑器都可能崩溃
  2. 无法清除/var/log/syslog同样由于文件过大,清除也是一个挑战
因此,要查看导致溢出的错误,请
tail -f /var/log/syslog

清除使用:
sudo cat /dev/null > /var/log/syslog

我遇到了类似的问题,我的syslog文件有115GB,syslog.1另外有115G,还有多个压缩文件。
第一步 找到源文件:
watch tail /var/log/syslog

你可能会注意到常见的错误条目; 在那之后,假设你的文件太大了;旋转几乎没有意义。 所以,你可以删除所有压缩文件和*.1文件来恢复磁盘空间(我的情况是大约300GB)。
第二步 截断文件,不要删除(否则将来可能会遇到很多权限问题),有很多方法,包括:
sudo tee /var/log/syslog </dev/null

你甚至可以在之前进行第二步并继续观察以找出原因,但请确保如果你不这样做,问题会再次发生。可能是一个循环中的某个问题,系统服务是一个好的起点(例如,一些快速重启且总是发生的东西)。

我不知道为什么,但是sudo tee /var/log/syslog </dev/null命令起作用了。但是我本来期望sudo cat /dev/null > /var/log/syslog也能起作用,但是没成功 :/ - uzay95

试一下这个。它应该能正确地工作并清理干净:
sudo sh -c 'cat /dev/null > /var/log/syslog'

3这似乎更多是掩盖症状而非解决问题。 - DavidR
sudo truncate -s 0 /var/log/syslog - asdjfiasd

检查/var/lib/logrotate/status文件,确保它被正确地进行了轮转。您还需要查看文件的内容,看是否有系统问题不断触发警报。

步骤1:在位置 /var/log/ 创建一个名为 clearlog.sh 的脚本文件,并设置文件权限为 'chmod 775 clearlog.sh'

clearlog.sh 文件的内容如下:

#!/bin/sh
LINECOUNTS=(`cat /var/log/syslog | wc -l`)

if [ $LINECOUNTS -gt "1000" ];
    then
        echo "Recreating syslog file due to lines "$LINECOUNTS" are more than 1000 lines"
        truncate -s 0 /var/log/syslog
        sleep 5
else
        echo "syslog file having line count "$LINECOUNTS" less than 1000}"
fi
/bin/systemctl restart syslog
exit

第二步:在位置 /etc/logrotate.d/logs 中编辑文件,添加 postrotate 部分

/var/log/syslog {
        daily
        rotate 3
        missingok
        copy
        notifempty
        compress
        dateext
        dateformat -%Y%m%d%H%M
        postrotate
                /var/log/clearlog.sh
        endscript
}

要测试上述脚本,请在命令终端中执行以下命令:'logrotate -f /etc/logrotate/logs'

一个晚回复原帖但这真的对我有帮助。当将程序作为服务运行时,似乎所有的printf语句都会被重定向到syslog而不是stdout,如果你的printf语句很多,那么syslog会很快填满。我使用了一些在这里建议的方法,但是sudo tee /var/log/syslog

这绝对不是解决问题的正确方式。日志文件被填满是有原因的 - 找出原因并解决问题。删除(旧)日志文件可能是一个临时解决方法,直到真正的问题得到解决。删除/清空活动日志文件(例如/var/log/syslog)通常在重新启动syslog服务或重启机器之前不会释放磁盘空间。 - Soren A