Ubuntu:大型syslog和kern.log文件

52

当我登录我的Ubuntu机器时,我收到一个警告,提示我将要用完磁盘空间。追溯一下,我发现是syslog,特别是kern.log正在耗尽我的1TB磁盘。

-rw-r----- 1 syslog adm 240G Feb 25 14:22 kern.log
-rw-r----- 1 syslog adm 516G Feb 21 07:59 kern.log.1
-rw-r----- 1 syslog adm 1.1K Feb 15 07:39 kern.log.2.gz
-rw-r----- 1 syslog adm  19K Feb  7 07:56 kern.log.3.gz
-rw-r----- 1 syslog adm  37K Feb  1 07:45 kern.log.4.gz
-rw-r----- 1 syslog adm  23G Feb 25 14:52 syslog
-rw-r----- 1 syslog adm  25G Feb 25 08:11 syslog.1
-rw-r----- 1 syslog adm 1.6G Feb 24 07:49 syslog.2.gz
-rw-r----- 1 syslog adm 1.7G Feb 23 08:18 syslog.3.gz
-rw-r----- 1 syslog adm 3.4G Feb 22 08:19 syslog.4.gz
-rw-r----- 1 syslog adm 3.6G Feb 21 07:59 syslog.5.gz
-rw-r----- 1 syslog adm 6.9G Feb 20 07:38 syslog.6.gz
-rw-r----- 1 syslog adm 7.3G Feb 19 07:36 syslog.7.gz

从上面的代码片段中,您可以轻松地发现kern.log和kern.log.1占用了我1TB硬盘的80%。我可以通过删除文件来获得空间,但我认为这并不能解决问题。

有没有人知道问题可能是什么?我看到您可以通过以下方式获取日志级别:

cat /proc/sys/kernel/printk

而我得到

4    4    1    7

4
我建议关闭这个问题,因为它不是一个编程问题。相比之下,[ubuntu.se] 更适合此类问题。请注意,我的翻译并未改变原意,同时让句子更加易懂。 - Ken White
这个问题似乎在askubuntu上有一个非常好的答案(比这里给出的任何答案都更完整):https://askubuntu.com/questions/184949/how-do-i-limit-the-size-of-my-syslog - ntg
4个回答

147

这是一个旧问题,但之前的两个答案都不是好的解决方案:

  • 接受的答案没有解释为什么如果您修复底层系统问题(答案是logrotate),磁盘问题就会消失,此外,您的系统可能会在您弄清楚根本问题之前继续写入日志并填满磁盘。
  • 另一个答案完全删除和禁用了日志,这不是一个好方法,因为它忽略了根本问题。此外,您以后可能需要这些日志文件来解决其他系统问题--禁用syslog会使跟踪未来问题更加困难!

相反,下面是一种更安全的方法,可以让您保留日志文件并回收磁盘空间,同时防止日志文件再次出现。

  1. 安全地清除日志:在查看(或备份)日志以识别系统问题后,通过键入>/var/log/syslog(包括>)来清除它们。您可能需要成为root用户才能执行此操作,在这种情况下,请输入sudo su,您的密码,然后输入上述命令)。
  • 然后重新启动syslog服务(systemctl restart syslogservice syslog restart)。
  1. 然后,您可以使用logrotate强制日志在达到一定大小时自动旋转和删除。在这种情况下,您可以使用sudo nano /etc/logrotate.d/rsyslog编辑配置并添加一行:
/var/log/syslog
{
    rotate 7
    daily
    maxsize 1G # add this line
    missingok
    notifempty
    delaycompress
    compress
    postrotate
        /usr/lib/rsyslog/rsyslog-rotate
    endscript
}
  • 这将强制你的 syslog 在1天或文件变为1GB中先到者时“轮换”(即创建一个新的日志文件并归档前一个日志文件)。注意,rotate 7 表示你的系统只会保留7个 syslog 备份,因此它只会占用7GB 的空间。
  • 注意:你可以更改 maxsizerotate N 和其他设置来自定义你的日志 - 使用命令 man logrotate查看更多信息。
  1. 在此过程中,你可能还想在文件的第二部分添加相同的设置,以控制其他日志文件的行为(例如内核事件的 kern.log,认证事件的 auth.log等)。这个设置将使得每个其他日志文件总共只占用4GB。
...
{
    rotate 4
    weekly
    maxsize 1G
...
}

这将使您的系统在不占用磁盘空间的情况下继续记录事件。

更多信息,请参阅手册和一个类似的问题


5
如果文件大小是在一天之内产生的,那么将其日志切割(logrotate)只能在一天后进行,因为logrotate每天只运行一次。如果想要每小时切割日志而不是每天,可以将它移动到如下位置:mv /etc/cron.daily/logrotate /etc/cron.hourly/ - rubo77
2
maxsizesize 的错别字吗?根据 logrotate 的 man 手册 中的 "配置文件" 部分,它指出 sizeminsize 都是有效的指令,但没有提到 maxsize(而且,在 /etc/logrotate.d/rsyslog 中设置 maxsize 没有解决我的大型日志文件问题,我将尝试设置 size,时间会告诉我们这是否有效)。 - Jake Levi
1
@JakeLevi 这不是打字错误(我已经在我的本地logrotate配置中成功使用了 maxsize),但你正确指出它在在线手册上没有被指定。当我运行 man logrotate 时,它仍会出现在我的系统中,因此我认为这应该是一个版本问题,尽管我在 logrotate changelog 中没有看到任何关于此的信息。我将发布有关 maxsize 的本地手动条目,这表明日志甚至在时间间隔之前就会被轮换(避免 @rubo77 提到的问题)。 - ascendants
3
maxsize _size_: 当日志文件大小超过_size_字节时,即使还未到规定的时间间隔(每天、每周、每月或每年),也会进行日志文件轮换。与此类似的选项是_size_,但它与时间间隔选项互斥,这将导致日志文件在不考虑上次轮换时间的情况下进行轮换。使用_maxsize_时,同时考虑日志文件的大小和时间戳。 - ascendants
我在本地检查了运行 man logrotate,你是对的,出于某种原因,在线手册上没有 maxsize 指令。 - Jake Levi
1
maxsize 对我来说没有期望的行为(使用 logrotate 版本 3.14.0),但是我通过在 /etc/logrotate.d/rsyslog 中的 /var/log/syslog/var/log/kern.log 配置中删除所有基于时间的指令(如 dailyweekly 等)并使用 size 100M 来获得所需的行为。我还使用了 sudo mv /etc/cron.daily/logrotate /etc/cron.hourly/logrotate,使日志轮换每小时发生一次,如此处所述。 - Jake Levi

32

你检查过那些文件的内容了吗?很明显你的服务器有些问题,导致产生了一些事件。解决引起这个问题的任何问题,你的日志应该会恢复到正常大小。

为了暂时解决这个问题,请输入

echo "" > /var/log/kern.log
echo "" > /var/log/syslog
service syslog restart
journalctl --vacuum-size=50M

您需要以root用户身份执行此操作:输入sudo su,然后输入密码,再执行上述命令。


这个救了我的命!+1 - Rohan Bari

10
  • logrotate 处理日志文件(如系统日志、内核日志)的轮换。
  • 输入以下命令以修改 logrotate 配置:
sudo nano /etc/logrotate.d/rsyslog
  • 对于日志文件大小超过限制的条目(比如 syslog, kern.log),如果没有配置,则添加下面所示的配置,否则修改现有配置以匹配下面所示的配置。
  • 一个配置由一个或多个指令行组成,这些指令行用花括号括起来,参见 man logrotate 并滚动到 DIRECTIVES 部分了解这些指令的描述。
  • 特别是,确保包含 size 100M 行,其中 100M 可根据您想要的日志文件最大大小进行修改,并确保没有基于时间的旋转指令,例如 dailyweekly 等等。
{
        rotate 7
        size 100M
        missingok
        ifempty
        delaycompress
        compress
        postrotate
                /usr/lib/rsyslog/rsyslog-rotate
        endscript
}
  • 日志文件的轮换可以通过 cron 进行定时安排,默认情况下每天进行一次轮换。
  • 您可以使用以下命令修改此行为,将日志文件的轮换安排为每小时一次:
sudo mv /etc/cron.daily/logrotate /etc/cron.hourly/logrotate
  • 有可能 logrotatecron 脚本被禁用,取而代之的是 systemd 定时器。
  • 可以通过以下方式确保 logrotatecron 脚本没有被禁用,而是使用 systemd 定时器:
    • 输入命令 sudo nano /etc/cron.hourly/logrotate 查看 logrotatecron 脚本的内容(如果您之前未移动脚本,则为 sudo nano /etc/cron.daily/logrotate
    • 检查以下四行是否存在,如果存在,请在每行开头添加 # 注释掉这些行,或者将它们删除:
# skip in favour of systemd timer
if [ -d /run/systemd/system ]; then
    exit 0
fi

您也可以使用以下命令手动强制旋转日志文件:
sudo logrotate --force --verbose /etc/logrotate.conf
  • 如果仅想查看上述命令将执行哪些操作,而不实际旋转或删除任何日志文件,请使用以下命令:
sudo logrotate --force --debug /etc/logrotate.conf
  • 如果您发现 /var/log/journal 文件夹也变得非常大,根据此答案,您可以使用以下命令清除它:
sudo journalctl --vacuum-size=100M
  • 为了让logrotate每次被cron调用时自动执行这个操作,输入命令sudo nano /etc/cron.hourly/logrotate(如果之前没有移动脚本,则输入sudo nano /etc/cron.daily/logrotate),并插入行journalctl --vacuum-size=100M(注意不包括sudo)。

1
我知道这个问题已经关闭了,但是这个答案应该被接受,它非常全面,并且包括解决了大多数人遇到的systemd定时器问题。 - jmatthews

1
ascendants 建议:“安全清除日志:在查看(或备份)日志以识别系统问题后”。
“真正的问题”在 logsys 文件中被发现:数百万行带有以下消息“PCIe Bus Error severity Corrected”。
“PCIe Bus Error severity Corrected”错误基本上是 Linux 报告,表示存在某些问题,对我来说是硬件兼容性问题。
这个问题导致几个文件或文件夹变得异常庞大(30GB或更多):/var/log/kern.log/var/log/syslog/var/log/journal/等等。
此网站 上,他们提供了四种解决方案,其中只有最后一种选项适用于我的情况。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接