如何在 Linux 上设置 Logrotate(防止服务器空间不足)

Linux 上的大部分服务都会生成日志文件,一般存放在/var/log/
。这些只是简单的文本文件,但它们可能会变得非常非常大,以至于您可能会耗尽服务器空间。
Logrotate 有什么作用?
Logrotate 有助于管理日志文件,并防止它们堆积。它会自动归档当前的日志文件,制作一个新的空文件,并在轮换几次后删除真正旧的档案。默认时间可能设置得非常高(nginx 默认为一年的日志),因此如果您不编辑配置文件,您可能会遇到问题。
您的文件大小会因服务而异,您需要相应地配置 logrotate。如果您想了解每个服务占用了多少日志空间,您可以使用 du
命令:
du -h /var/log/ | sort -hr
几乎所有的日志文件都在 /var/log/
中,因此 du
将汇总所有日志文件,并将它们显示在一个漂亮的列表中(由 提供) sort -hr
用于“人类可读”):

这仅显示目录,因此您需要使用 ls -sh
来查找单个文件的大小。
通常,Web 服务器(apache2、nginx 等)和其他接收大量交互的应用程序会生成大量日志文件,但确切的大小将取决于它们实际记录到磁盘的数据量。
安装 Logrotate(如果您还没有)
默认情况下,您可能不需要做任何设置 logrotate,因为它默认安装在许多发行版上,并且生成大量日志文件的服务(nginx、apache 等)通常会预先配置 logrotate 配置。
您可以检查是否安装了 logrotate:
which logrotate
或者如果没有的话,从你的发行版的包管理器安装它。对于像 Ubuntu 这样的基于 Debian 的系统,这将是:
sudo apt-get install logrotate
Logrotate 将自动安装其默认全局配置,但如果您在安装 Web 服务器后安装了它,则如果未生成该服务的默认配置,您可能必须重新安装 Web 服务器。
Logrotate 如何运作
虽然 logrotate 将针对 nginx 和 apache2 等流行服务进行预配置,但您可能希望手动设置配置,或编辑默认配置。
logrotate 的全局配置存储在 /etc/logrotate.conf
中,但您将使用存储在 /etc/logrotate.d/ 中的每个应用程序配置文件覆盖大部分配置
目录。让我们看一下 nginx 在 /etc/logrotate.d/nginx
中的默认配置,您可以将其用作将新应用程序添加到 logrotate 的模板:
/var/log/nginx/*.log {
weekly
missingok
rotate 52
compress
delaycompress
notifempty
create 0640 www-data adm
sharedscripts
prerotate
if [ -d /etc/logrotate.d/httpd-prerotate ]; then
run-parts /etc/logrotate.d/httpd-prerotate;
fi
endscript
postrotate
invoke-rc.d nginx rotate >/dev/null 2>&1
endscript
}
第一行开始该块,并告诉 logrotate 要查找哪些文件。通配符 *.log
将匹配 nginx 日志文件夹中以 .log
扩展名结尾的任何文件。您还可以在此处指定多个目录以将它们包含在相同的配置中。
weekly 将每周轮换一次日志。如果您想根据大小旋转它们,您可以使用 size 25M
在它们达到特定限制后旋转它们,在本例中为 25 兆字节。
missingok 如果日志文件被除 logrotate 以外的任何其他方式删除,将防止 logrotate 抛出错误。
rotate 52将保留 52 个不同的日志文件。在这种情况下,由于它将每周轮换一次,因此 logrotate 将在删除旧文件之前保留一整年的日志文件。您可以将其更改为 rotate 4
以仅保留一个月的日志文件。
compress 将压缩旧日志文件以节省空间。这会导致某些应用程序在 logrotate 仍在执行其操作时继续写入日志文件的问题,因此您可以添加 delaycompress 标志以在压缩前留下一个旧日志文件的缓冲区。
notifempty 是另一个检查标志,用于确保 logrotate 仅在写入新日志文件时运行。 create 标志使这些新的日志文件具有特定的权限。语法是 create [mode] [owner] [group]
。
您需要确保这些匹配您当前配置的任何日志文件,您可以使用 ls -la
执行此操作:

请注意,您需要将模式转换为八进制,因此 -rw-r-----
变为 0640
。这里 nginx 的所有者是 www-data
,组是 adm
。
sharedscripts 指定 prerotate 和 postrotate 挂钩每次轮换仅运行一次,而不是为每个轮换的日志文件运行一次。这些挂钩是您可以在旋转前后调用的脚本。默认情况下,这些将运行一些脚本来配置 nginx 以切换日志文件。如果您配置的服务无法热加载新的日志文件,您将希望在这些挂钩中停止并重新启动它。钩子不必与服务交互;例如,您可以使用 prerotate 挂钩在日志文件被删除之前通过 s3cmd
将您的日志文件备份到 AWS S3。
Logrotate 将自行管理运行,因此您无需担心在启动时启动服务或配置 cron
作业。只需将每个应用程序的配置文件放在 /etc/logrotate.d/
中,再也不用担心日志了。