如何在Ubuntu20.04上使用Logrotate管理日志文件
介绍
Logrotate 是一个系统实用程序,用于管理日志文件的自动轮换和压缩。 如果日志文件没有被轮换、压缩和定期修剪,它们最终可能会消耗系统上所有可用的磁盘空间。
Logrotate 在 Ubuntu 20.04 上默认安装,并设置为处理所有已安装软件包的日志轮换需求,包括默认系统日志处理器 rsyslog
。
在本文中,我们将探索默认的 Logrotate 配置,然后为虚构的自定义应用程序配置日志轮换。
先决条件
本教程假设您有一个 Ubuntu 20.04 服务器,并且有一个非 root 启用 sudo 的用户,如 使用 Ubuntu 20.04 的初始服务器设置中所述。
Logrotate 在许多其他 Linux 发行版上也可用,但默认配置可能完全不同。 只要您的 Logrotate 版本与 Ubuntu 20.04 相似,本教程的其他部分仍然适用。 按照步骤 1 确定您的 Logrotate 版本。
以启用 sudo 的用户身份登录您的服务器以开始。
您还可以使用嵌入在此页面上的交互式终端来试验本教程中的 logrotate。 单击下面的 Launch an Interactive Terminal! 按钮开始使用。
启动交互式终端!
第 1 步 - 确认您的 Logrotate 版本
Logrotate 默认安装在 Ubuntu 上。 但是,如果您需要安装它,请运行以下命令来更新您的包列表并检索包:
sudo apt update sudo apt install logrotate
如果您使用的是非 Ubuntu 服务器,请首先通过询问其版本信息来确保已安装 Logrotate:
logrotate --version
Outputlogrotate 3.14.0 Default mail command: /usr/bin/mail Default compress command: /bin/gzip Default uncompress command: /bin/gunzip Default compress extension: .gz Default state file path: /var/lib/logrotate/status ACL support: yes SELinux support: yes
如果安装了 Logrotate 但版本号明显不同,您可能会遇到本教程中探讨的某些配置选项的问题。 通过阅读其手册 (man
) 页面来参考您特定版本的 Logrotate 的文档:
man logrotate
也可以参考【X21X】在线版【X43X】的Logrotate文档。 接下来我们来看看 Logrotate 在 Ubuntu 上的默认配置结构。
第 2 步 - 探索 Logrotate 配置
Logrotate 的配置信息一般可以在 Ubuntu 的两个地方找到:
/etc/logrotate.conf
:此文件包含一些默认设置,并为一些不属于任何系统包的日志设置轮换。 它还使用include
语句从/etc/logrotate.d
目录中的任何文件中提取配置。/etc/logrotate.d/
:这是您安装的任何需要日志轮换帮助的软件包将放置其 Logrotate 配置的位置。 在标准安装中,您应该已经在此处拥有apt
、dpkg
、rsyslog
等核心系统工具的文件。
默认情况下,logrotate.conf
将配置每周日志轮换,日志文件由 root 用户和 syslog 组拥有,一次保留四个日志文件( rotate 4
),并在当前日志文件轮换后创建新的空日志文件(create
)。
让我们看一下/etc/logrotate.d
中一个包的Logrotate配置文件。 cat
apt
包实用程序的文件:
cat /etc/logrotate.d/apt
Output/var/log/apt/term.log { rotate 12 monthly compress missingok notifempty } /var/log/apt/history.log { rotate 12 monthly compress missingok notifempty }
此文件包含 /var/log/apt/
目录中两个不同日志文件的配置块:term.log
和 history.log
。 他们都有相同的选择。 任何未在这些配置块中设置的选项都将继承默认值或在 /etc/logrotate.conf
中设置的值。 logrotate 文件中的任何设置都将覆盖 logrotate 的默认值,这些默认值在 /etc/logrotate.conf
中配置。 为 apt
日志设置的选项有:
rotate 12
:保留十二个旧日志文件。 这将覆盖rotate 4
默认值。monthly
:每月轮换一次。 这将覆盖weekly
默认值。compress
:压缩旋转后的文件。 这默认使用gzip
并导致文件以.gz
结尾。 可以使用compresscmd
选项更改压缩命令。missingok
:如果日志文件丢失,不要写错误信息。notifempty
:如果日志文件为空,则不轮换。
这些配置文件还继承了默认的 create
行为,它指示 Logrotate 在轮换后创建新日志。 这可以用 nocreate
覆盖,尽管这会有效地禁用大多数其他功能。
还有更多可用的配置选项。 您可以通过在命令行上键入 man logrotate
来打开 Logrotate 的手册页来阅读所有这些内容。
接下来,我们将设置一个配置文件来处理名为 your-app
的虚构服务的日志。
第 3 步 — 设置示例配置
要使用 logrotate 为预打包和预配置的系统服务之外的应用程序管理日志文件,我们有两种选择:
- 新建一个Logrotate配置文件,放在
/etc/logrotate.d/
中。 这将每天以 root 用户身份运行,以及所有其他标准 Logrotate 作业。 - 创建一个新的配置文件并在 Ubuntu 的默认 Logrotate 设置之外运行它。 仅当您需要以非 root 用户身份运行 Logrotate,或者如果您希望比每天更频繁地轮换日志([X180X 中的
hourly
配置),这才是真正必要的] 将无效,因为系统的 Logrotate 设置每天只运行一次)。
让我们通过一些示例设置来了解这两个选项。
将配置添加到 /etc/logrotate.d/
我们想为将 access.log
和 error.log
放入 /var/log/your-app/
的虚构 Web 服务器配置日志轮换。 它以 www-data
用户和组的身份运行。
要将 your-app
日志文件的配置添加到 /etc/logrotate.d/
,首先使用 nano
或您喜欢的编辑器在 /etc/logrotate.d
目录中打开一个新文件:
sudo nano /etc/logrotate.d/your-app
将以下行添加到新的配置文件中:
/etc/logrotate.d/your-app
/var/log/your-app/*.log { daily missingok rotate 14 compress notifempty create 0640 www-data www-data sharedscripts postrotate systemctl reload your-app endscript }
此文件中的一些新配置指令是:
create 0640 www-data www-data
:这会在轮换后创建一个新的空日志文件,具有指定的权限(0640
)、所有者(www-data
)和组(也称为www-data
)。sharedscripts
:此标志意味着添加到配置中的任何脚本每次运行仅运行一次,而不是为每个旋转的文件运行一次。 由于路径/var/log/your-app/*.log
包含通配符*
,因此此配置将匹配your-app
目录中任意数量的日志文件。 如果没有sharedscripts
选项,则在每次 logrotate 处理没有此选项的日志文件时,postrotate
中指定的脚本都会运行。postrotate
到endscript
:此块包含在日志文件轮换后运行的脚本。 在这种情况下,我们正在重新加载我们的示例应用程序。 这有时对于让您的应用程序切换到新创建的日志文件是必要的。 请注意,postrotate
在日志压缩之前运行。 压缩可能需要很长时间,您的软件应立即切换到新的日志文件。 对于需要在 日志压缩后运行 的任务,请改用lastaction
块。
要保存并退出 nano
,请按 Ctrl+X
,然后在出现提示时按 Y
,然后按 Enter
。 您可以通过试运行来测试配置文件:
sudo logrotate /etc/logrotate.conf --debug
该命令调用 logrotate
,将其指向标准配置文件,并打开调试模式。
信息将打印出有关 Logrotate 正在处理哪些日志文件以及它将对它们做什么的信息。 如果一切看起来都很好,你就完成了。 标准的 Logrotate 作业将每天运行一次,并包含您的新配置。
接下来,我们将尝试一个完全不使用 Ubuntu 的默认配置的设置。
第 4 步 - 创建独立的 Logrotate 配置
在这个例子中,我们有一个应用程序作为我们的用户 sammy
运行,生成存储在 /home/sammy/logs/
中的日志。 我们希望每小时轮换这些日志,因此我们需要在 Ubuntu 提供的 /etc/logrotate.d
结构之外进行设置。
首先,我们将在我们的主目录中创建一个配置文件。 在文本编辑器中打开它:
nano /home/sammy/logrotate.conf
然后粘贴以下配置:
/home/sammy/logrotate.conf
/home/sammy/logs/*.log { hourly missingok rotate 24 compress create }
保存并关闭文件。 我们在前面的步骤中遇到了所有这些选项,但让我们总结一下:此配置将每小时轮换文件,压缩并保留 24 个旧日志并创建一个新日志文件来替换轮换的日志文件。
您需要自定义配置以适合您的应用程序,但这是一个好的开始。
为了测试配置是否有效,让我们创建一个日志文件。 首先使用 cd ~
命令将 cd
到您用户的主目录。 然后使用 mkdir
命令为日志创建一个目录。 最后使用touch
命令在logs
目录下创建一个空文件。 运行以下命令以完成这些步骤:
cd ~ mkdir logs touch logs/access.log
现在我们在正确的位置有一个空白日志文件,让我们运行 logrotate
命令。
因为日志归 sammy
所有,我们不需要使用 sudo
。 但是,我们 do 需要指定一个 state 文件。 该文件记录了 logrotate
找到的内容以及它上次运行时采取的任何操作,以便它知道下次运行时要做什么。 当使用默认的 /etc/logrotate.conf
配置时,我们会处理这种状态跟踪。 状态文件存储在 /var/lib/logrotate/status
中。 由于我们没有使用默认配置,我们需要手动配置状态文件位置。
对于此示例,我们将让 Logrotate 将状态文件放在我们的主目录中。 它可以去任何可以访问和方便的地方。 运行以下命令以使用您创建的 /home/sammy/logrotate.conf
并记录 logrotate 遇到的状态:
logrotate /home/sammy/logrotate.conf --state /home/sammy/logrotate-state --verbose
Outputreading config file /home/sammy/logrotate.conf Handling 1 logs rotating pattern: /home/sammy/logs/*.log hourly (24 rotations) empty log files are rotated, old logs are removed considering log /home/sammy/logs/access.log log does not need rotating
--verbose
标志将打印出有关 Logrotate 正在做什么的详细信息。 在这种情况下,它没有旋转任何东西。 这是 Logrotate 第一次遇到这个日志文件,它是零小时的,所以不应该轮换。
如果我们使用 cat
实用程序检查状态文件,我们会注意到 Logrotate 记录了一些有关运行的信息:
cat /home/sammy/logrotate-state
Outputlogrotate state -- version 2 "/home/sammy/logs/access.log" 2021-12-3-19:0:0
Logrotate 记录了它看到的日志以及上次考虑轮换的时间。 如果我们在一小时后运行相同的命令,日志将按预期轮换。
如果您想强制 Logrotate 轮换日志文件,否则请使用 --force
标志:
logrotate /home/sammy/logrotate.conf --state /home/sammy/logrotate-state --verbose --force
这在测试 postrotate
和其他脚本时很有用。
最后,我们需要设置一个 cron 作业来每小时运行一次 Logrotate。 打开用户的 crontab:
crontab -e
这将打开一个文本文件。 如果这是您第一次使用 cron,系统可能会提示您选择默认文本编辑器。 如果您没有偏好,我们建议新用户使用 nano
。 文件中可能已经有一些解释 cron 语法的注释。 将光标向下移动到文件末尾的新空行并添加以下内容:
crontab14 * * * * /usr/sbin/logrotate /home/sammy/logrotate.conf --state /home/sammy/logrotate-state
此任务将在每天每小时的第 14 分钟运行。 它运行几乎与我们之前运行的 logrotate
命令相同的命令,但为了安全起见,我们将 logrotate
扩展到其 /usr/sbin/logrotate
的完整路径。 在编写 cron 作业时使用完整路径是一种很好的做法。 要了解有关 cron 的更多信息,您可以查看我们的其他 教程。
保存文件并退出。 这将安装 crontab,我们的任务将按指定的时间表运行。
如果我们在大约一个小时内重新访问我们的日志目录,我们应该会找到旋转和压缩的日志文件 access.log.1.gz
(如果您使用 --force
标志运行 Logrotate,则为 .2.gz
)。
结论
在本教程中,我们验证了我们的 Logrotate 版本,探索了默认的 Ubuntu Logrotate 配置,并设置了两种不同类型的自定义配置。 要了解有关 Logrotate 可用的命令行和配置选项的更多信息,您可以通过在终端中运行 man logrotate
或访问 在线文档 来阅读其手册页。