Ubuntu:大型 syslog 和 kern.log 文件

and*_*tks 16 ubuntu syslog ubuntu-14.04

登录到我的 Ubuntu 机器时,我收到一条警告,指出我的磁盘空间不足。回溯,我发现是系统日志,尤其是 kern.log(s) 占用了我的 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
Run Code Online (Sandbox Code Playgroud)

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

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

cat /proc/sys/kernel/printk
Run Code Online (Sandbox Code Playgroud)

我得到

4    4    1    7
Run Code Online (Sandbox Code Playgroud)

asc*_*nts 58

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

  • 已接受的答案并没有解释为什么如果您修复了底层系统问题(答案是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
}
Run Code Online (Sandbox Code Playgroud)
  • 这将强制您syslog在 1 天后或文件变为 1GB(以先到者为准)后“旋转”(即,创建新的日志文件并存档以前的日志文件)。请注意,这rotate 7意味着您的系统将只保留 7 个总syslog备份,因此它只能占用 7GB 的空间
  • 注意:您可以更改maxsizerotate N和其他设置来自定义您的日志——使用该命令man logrotate可以查看更多信息。
  1. 在此期间,您可能希望在文件的第二部分添加相同的设置,该设置管理其他日志文件的行为(例如kern.log,内核事件、auth.log身份验证事件等)。此设置将使每个其他日志文件总共只占用 4GB。:
...
{
    rotate 4
    weekly
    maxsize 1G
...
}
Run Code Online (Sandbox Code Playgroud)

这将允许您的系统在不填满磁盘的情况下保持记录事件。

有关更多信息,请参阅手册类似问题

  • 如果大小是在一天内生成的,这不是一个解决方案,因为 logrotate 每天只运行一次。要每小时而不是每天运行 logrotate,您可以移动它:`mv /etc/cron.daily/logrotate /etc/cron.hourly/` (3认同)
  • “maxsize”是“size”的拼写错误吗?根据 [logrotate 的手册页](https://linux.die.net/man/8/logrotate),在“配置文件”部分下,它指出 `size` 和 `minsize` 都是有效的指令,但没有提到“maxsize”(此外,在“/etc/logrotate.d/rsyslog”中设置“maxsize”并没有解决我的大日志文件问题,我将尝试设置“size”和时间会告诉你这是否有效) (3认同)
  • **maxsize** _size_:“即使在额外指定的时间间隔(每天、每周、每月或每年)之前,当日志文件增长超过 size 字节时,也会轮换日志文件。相关的大小选项类似,只是它与时间间隔选项互斥,并且它会导致日志文件轮换而不考虑上次轮换时间。当使用 maxsize 时,日志文件的大小和时间戳都会被考虑。 (3认同)
  • 这应该是公认的答案 (2认同)
  • 由于某种原因,“maxsize”没有达到我想要的行为(使用“logrotate”版本 3.14.0),但我设法通过使用“size 100M”并删除所有基于时间的指令(“ daily`、`weekly` 等)来自 `/etc/logrotate.d/rsyslog` 中的 `/var/log/syslog` 和 `/var/log/kern.log` 配置。我还使用 `sudo mv /etc/cron.daily/logrotate /etc/cron.hourly/logrotate` 使轮换每小时而不是每天发生,如[此处](https://serverfault.com/a/851038/ 620693) (2认同)

Jak*_*evi 11

  • 日志文件(EG 系统日志、内核日志)的轮换由logrotate
  • 输入以下命令修改配置logrotate
sudo nano /etc/logrotate.d/rsyslog
Run Code Online (Sandbox Code Playgroud)
  • 在达到问题大小的日志文件条目(EG syslogkern.log)下,如果没有配置,则添加如下所示的配置,否则修改现有配置以如下所示的配置
  • 配置由一行或多行括在大括号中的指令组成,键入man logrotate并向下滚动到DIRECTIVES这些指令的说明部分
  • 特别是,请确保包含行size 100M,其中100M可以根据您希望日志文件占用的最大大小进行修改,并确保没有基于时间的轮换指令, EG dailyweekly
{
        rotate 7
        size 100M
        missingok
        ifempty
        delaycompress
        compress
        postrotate
                /usr/lib/rsyslog/rsyslog-rotate
        endscript
}
Run Code Online (Sandbox Code Playgroud)
  • 日志文件的轮换可以通过 进行安排cron,默认情况下每天进行一次
  • 您可以使用以下命令修改此行为,以安排日志文件每小时而不是每天轮换:
sudo mv /etc/cron.daily/logrotate /etc/cron.hourly/logrotate
Run Code Online (Sandbox Code Playgroud)
  • cron脚本可能logrotate被禁用以支持systemd计时器
  • 您可以确保cron脚本logrotate不会被禁用以支持systemd计时器,如下所示:
    • 输入命令以查看脚本sudo nano /etc/cron.hourly/logrotate的内容(或者如果您之前没有移动过脚本)cronlogrotatesudo nano /etc/cron.daily/logrotate
    • 检查以下四行是否存在,如果存在,请通过#在每行开头放置 来注释掉它们,或者完全删除这些行:
# skip in favour of systemd timer
if [ -d /run/systemd/system ]; then
    exit 0
fi
Run Code Online (Sandbox Code Playgroud)
  • 您还可以使用以下命令手动强制轮换日志文件:
sudo logrotate --force --verbose /etc/logrotate.conf
Run Code Online (Sandbox Code Playgroud)
  • 要简单地查看上述命令将执行哪些操作,而不实际轮换或删除任何日志文件,请使用以下命令:
sudo logrotate --force --debug /etc/logrotate.conf
Run Code Online (Sandbox Code Playgroud)
  • 如果你发现该/var/log/journal文件夹也变得很大,根据这个答案,你可以使用以下命令清除它:
sudo journalctl --vacuum-size=100M
Run Code Online (Sandbox Code Playgroud)
  • 要使这种情况在每次logrotate由 调用时自动发生cron,请输入命令sudo nano /etc/cron.hourly/logrotate(或者sudo nano /etc/cron.daily/logrotate如果您之前没有移动脚本)并插入该行journalctl --vacuum-size=100M(注意不包括sudo


小智 5

你检查过这些文件的内容吗?您的服务器显然发生了一些事情,导致生成事件。解决导致该问题的任何问题,您的日志应该会恢复到正常大小。

要临时解决问题,请键入

echo "" > /var/log/kern.log
echo "" > /var/log/syslog
service syslog restart
journalctl --vacuum-size=50M
Run Code Online (Sandbox Code Playgroud)

为此sudo su,您需要成为 root 用户:输入,您的密码,然后输入上述命令

  • 这个人救了我的命!+1 (2认同)