【问题标题】:Ubuntu: large syslog and kern.log filesUbuntu:大型 syslog 和 kern.log 文件
【发布时间】:2016-06-08 20:55:25
【问题描述】:

登录到我的 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

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

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

cat /proc/sys/kernel/printk

我明白了

4    4    1    7

【问题讨论】:

  • 我投票结束这个问题,因为它不是一个编程问题。更适合Ask Ubuntu

标签: ubuntu ubuntu-14.04 syslog


【解决方案1】:
  • 日志文件(EG系统日志、内核日志)的轮换由logrotate处理
  • 输入以下命令修改logrotate配置:
sudo nano /etc/logrotate.d/rsyslog
  • 在达到问题大小的日志文件条目下(EGsyslogkern.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文件夹也变大了,根据this answer,可以用如下命令清除:
sudo journalctl --vacuum-size=100M
  • 要在每次cron 调用logrotate 时自动执行此操作,请输入命令sudo nano /etc/cron.hourly/logrotate(或sudo nano /etc/cron.daily/logrotate,如果您之前没有移动脚本)并插入行journalctl --vacuum-size=100M(注意不包括sudo)

【讨论】:

    【解决方案2】:

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

    • 接受的答案并不能解释为什么如果您修复了底层系统问题(答案是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
    ...
    }
    

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

    有关更多信息,请参阅 manualsimilar question

    【讨论】:

    • 如果size是一天生成的,这不是解决办法,因为logrotate一天只运行一次。要每小时而不是每天运行 logrotate,您可以移动它:mv /etc/cron.daily/logrotate /etc/cron.hourly/
    • maxsizesize 的拼写错误吗?根据the man page for logrotate,在“配置文件”部分下,它指出sizeminsize都是有效指令,但没有提到maxsize(此外,在/etc/logrotate.d/rsyslog中设置maxsize没有解决我的大日志文件问题,我将尝试设置size,时间会证明这是否有效)
    • @JakeLevi 这不是一个错字(我有 maxsize 成功使用我的本地 logrotate 配置),但你是正确的,它没有在在线手册页中指定。在运行man logrotate 时它仍然显示在我的系统上,所以我认为这是一个版本问题,尽管我在logrotate changelog 中没有看到任何关于此的内容。我将在maxsize 发布我的本地手动条目,这表明日志甚至会在时间间隔之前轮换(避免@rubo77 提到的问题)
    • 最大尺寸 尺寸Log files are rotated when they grow bigger than size bytes even before the additionally specified time interval (daily, weekly, monthly, or yearly). The related size option is similar except that it is mutually exclusive with the time interval options, and it causes log files to be rotated without regard for the last rotation time. When maxsize is used, both the size and timestamp of a log file are considered.
    • maxsize 出于某种原因(使用 logrotate 版本 3.14.0)对我来说没有所需的行为,但我设法通过使用 size 100M 获得所需的行为,并删除/var/log/syslog/var/log/kern.log 配置中的所有基于时间的指令(dailyweekly 等)/etc/logrotate.d/rsyslog。我还使用sudo mv /etc/cron.daily/logrotate /etc/cron.hourly/logrotate 来实现每小时而不是每天的轮换,如here 所述
    【解决方案3】:

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

    要临时解决问题,请键入

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

    你需要是root用户:输入sudo su,你的密码,然后上面的命令

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-09
      • 1970-01-01
      • 2012-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多