Ubuntu:大型系统日志和 kern.log 文件
Ubuntu: large syslog and kern.log files
登录到我的 Ubuntu 机器时,我收到一条警告,提示我 运行 磁盘 space 不足。追溯过去,我发现是系统日志,尤其是 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
从上面的代码片段中,您可以轻松地发现 kern.log 和 kern.log.1 占用了我 1TB 磁盘空间的 80%。我可以通过删除文件得到space,但我认为这不能解决问题。
有人知道问题出在哪里吗?
我看到您可以通过以下方式获取日志记录级别:
cat /proc/sys/kernel/printk
然后我得到
4 4 1 7
你检查过那些文件的内容了吗?显然您的服务器发生了某些事情导致生成事件。解决导致该问题的任何问题,您的日志应该 return 到正常大小。
要临时解决问题,请输入
echo "" > /var/log/kern.log
echo "" > /var/log/syslog
service syslog restart
journalctl --vacuum-size=50M
为此您需要成为 root 用户:输入 sudo su
、您的密码,然后执行上述命令
这是一个老问题,但前两个答案都不是很好的解决方案:
- 接受的答案没有解释为什么修复底层系统问题后磁盘问题就会消失(答案是
logrotate
),而且您的系统可能会继续写入日志并填满磁盘在你弄清楚根本问题之前。
- 另一个答案完全删除并禁用了日志,这不是一个好方法,因为它忽略了潜在的问题。此外,当您稍后找出其他系统问题时,您可能会需要这些日志文件——禁用
syslog
会使跟踪未来问题变得更加困难!
相反,这里有一个更安全的方法,可以让您在回收磁盘 space 的同时保留日志文件,同时阻止日志文件再次执行此操作。
- 安全清除日志:查看(或备份)日志以确定系统问题后,通过键入
> /var/log/syslog
(包括 >
)清除它们。为此,您可能需要成为 root 用户,在这种情况下,输入 sudo su
、您的密码,然后输入上述命令。
- 然后重新启动系统日志服务(
systemctl restart syslog
或 service syslog restart
)。
- 然后,您可以使用
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 的 space
- 注意:您可以更改
maxsize
、rotate N
和其他设置来自定义您的日志——使用命令 man logrotate
查看更多。
- 当你这样做时,你可能想在文件的第二部分添加相同的设置,它控制其他日志文件的行为(例如
kern.log
用于内核事件,auth.log
用于身份验证事件等)。此设置将使这些其他日志文件中的每一个总共只占用 4GB。:
...
{
rotate 4
weekly
maxsize 1G
...
}
这将允许您的系统继续记录事件,而不会填满您的磁盘。
有关更多信息,请参阅 manual and a similar question。
- 日志文件(EG 系统日志、内核日志)的轮换由
logrotate
处理
- 输入以下命令修改
logrotate
配置:
sudo nano /etc/logrotate.d/rsyslog
- 在达到问题大小的日志文件的条目下 (EG
syslog
, kern.log
),如果没有配置则添加如下所示的配置,否则将现有配置修改为看起来像下面显示的配置
- 配置由一行或多行包含在大括号中的指令组成,键入
man logrotate
并向下滚动到 DIRECTIVES
部分以获取这些指令的描述
- 特别要确保包括
size 100M
行,其中100M
可以根据您希望日志文件占用的最大大小进行修改,并确保没有基于时间的轮换指令,例如 daily
、weekly
等
{
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
logrotate
的 cron
脚本可能被禁用以支持 systemd
计时器
- 您可以确保
logrotate
的 cron
脚本没有被禁用以支持 systemd
计时器,如下所示:
- 输入命令
sudo nano /etc/cron.hourly/logrotate
查看 logrotate
的 cron
脚本的内容(或者 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
)
正如 ascendants 所建议的:“安全地清除日志:在查看(或备份)日志以确定您的系统问题之后”[=15=]
在 logsys 文件中发现了真正的问题:数百万行带有以下消息“PCIe Bus Error severity Corrected”。
“PCIe 总线错误严重性已更正”错误基本上是一个 Linux 报告,表明存在一些问题,在我的情况下是硬件兼容性。
此问题导致多个文件或文件夹增长失调(30 GB 或更多):/var/log/kern.log
、/var/log/syslog
、/var/log/journal/
等
在 this site 他们提供了四种解决方法,在我的例子中只有最后一个选项对我有用。
登录到我的 Ubuntu 机器时,我收到一条警告,提示我 运行 磁盘 space 不足。追溯过去,我发现是系统日志,尤其是 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
从上面的代码片段中,您可以轻松地发现 kern.log 和 kern.log.1 占用了我 1TB 磁盘空间的 80%。我可以通过删除文件得到space,但我认为这不能解决问题。
有人知道问题出在哪里吗? 我看到您可以通过以下方式获取日志记录级别:
cat /proc/sys/kernel/printk
然后我得到
4 4 1 7
你检查过那些文件的内容了吗?显然您的服务器发生了某些事情导致生成事件。解决导致该问题的任何问题,您的日志应该 return 到正常大小。
要临时解决问题,请输入
echo "" > /var/log/kern.log
echo "" > /var/log/syslog
service syslog restart
journalctl --vacuum-size=50M
为此您需要成为 root 用户:输入 sudo su
、您的密码,然后执行上述命令
这是一个老问题,但前两个答案都不是很好的解决方案:
- 接受的答案没有解释为什么修复底层系统问题后磁盘问题就会消失(答案是
logrotate
),而且您的系统可能会继续写入日志并填满磁盘在你弄清楚根本问题之前。 - 另一个答案完全删除并禁用了日志,这不是一个好方法,因为它忽略了潜在的问题。此外,当您稍后找出其他系统问题时,您可能会需要这些日志文件——禁用
syslog
会使跟踪未来问题变得更加困难!
相反,这里有一个更安全的方法,可以让您在回收磁盘 space 的同时保留日志文件,同时阻止日志文件再次执行此操作。
- 安全清除日志:查看(或备份)日志以确定系统问题后,通过键入
> /var/log/syslog
(包括>
)清除它们。为此,您可能需要成为 root 用户,在这种情况下,输入sudo su
、您的密码,然后输入上述命令。
- 然后重新启动系统日志服务(
systemctl restart syslog
或service syslog restart
)。
- 然后,您可以使用
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 的 space - 注意:您可以更改
maxsize
、rotate N
和其他设置来自定义您的日志——使用命令man logrotate
查看更多。
- 当你这样做时,你可能想在文件的第二部分添加相同的设置,它控制其他日志文件的行为(例如
kern.log
用于内核事件,auth.log
用于身份验证事件等)。此设置将使这些其他日志文件中的每一个总共只占用 4GB。:
...
{
rotate 4
weekly
maxsize 1G
...
}
这将允许您的系统继续记录事件,而不会填满您的磁盘。
有关更多信息,请参阅 manual and a similar question。
- 日志文件(EG 系统日志、内核日志)的轮换由
logrotate
处理
- 输入以下命令修改
logrotate
配置:
sudo nano /etc/logrotate.d/rsyslog
- 在达到问题大小的日志文件的条目下 (EG
syslog
,kern.log
),如果没有配置则添加如下所示的配置,否则将现有配置修改为看起来像下面显示的配置 - 配置由一行或多行包含在大括号中的指令组成,键入
man logrotate
并向下滚动到DIRECTIVES
部分以获取这些指令的描述 - 特别要确保包括
size 100M
行,其中100M
可以根据您希望日志文件占用的最大大小进行修改,并确保没有基于时间的轮换指令,例如daily
、weekly
等
{
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
logrotate
的cron
脚本可能被禁用以支持systemd
计时器- 您可以确保
logrotate
的cron
脚本没有被禁用以支持systemd
计时器,如下所示:- 输入命令
sudo nano /etc/cron.hourly/logrotate
查看logrotate
的cron
脚本的内容(或者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
)
正如 ascendants 所建议的:“安全地清除日志:在查看(或备份)日志以确定您的系统问题之后”[=15=]
在 logsys 文件中发现了真正的问题:数百万行带有以下消息“PCIe Bus Error severity Corrected”。
“PCIe 总线错误严重性已更正”错误基本上是一个 Linux 报告,表明存在一些问题,在我的情况下是硬件兼容性。
此问题导致多个文件或文件夹增长失调(30 GB 或更多):/var/log/kern.log
、/var/log/syslog
、/var/log/journal/
等
在 this site 他们提供了四种解决方法,在我的例子中只有最后一个选项对我有用。