如何在 Ubuntu 16.04 上使用 Logrotate 管理日志文件如何在 Ubuntu 16.04 上使用 Logrotate 管理日志文件如何在 Ubuntu 16.04 上使用 Logrotate 管理日志文件如何在 Ubuntu 16.04 上使用 Logrotate 管理日志文件
  • 文章
  • 正则表达式
    • 工具
  • 登录
找到的结果: {phrase} (显示: {results_count} 共: {results_count_total})
显示: {results_count} 共: {results_count_total}

加载更多搜索结果...

搜索范围
模糊匹配
搜索标题
搜索内容
发表 admin at 2025年2月28日
类别
  • 未分类
标签

如何在 Ubuntu 16.04 上使用 Logrotate 管理日志文件

介绍

Logrotate 是一个系统实用程序,用于管理日志文件的自动轮换和压缩。如果日志文件没有轮换、压缩和定期修剪,它们最终可能会耗尽系统上所有可用的磁盘空间。

Logrotate 默认安装在 Ubuntu 16.04 上,并设置为处理所有已安装软件包的日志轮换需求,包括默认系统日志处理器 rsyslog。

在本文中,我们将探索默认的 Logrotate 配置,然后为一个虚构的自定义应用程序配置日志轮换。

先决条件

本教程假设您有一个 Ubuntu 16.04 服务器,并且有一个非 root 启用 sudo 的用户,如使用 Ubuntu 16.04 进行初始服务器设置中所述。

许多其他 Linux 发行版也提供 Logrotate,但默认配置可能大不相同。只要您的 Logrotate 版本类似于 Ubuntu 16.04,本教程的其他部分仍然适用。按照步骤 1 确定您的 Logrotate 版本。

以启用 sudo 的用户身份登录到您的服务器以开始。

确认您的 Logrotate 版本

如果您使用的是非 Ubuntu 服务器,请首先通过询问其版本信息来确保已安装 Logrotate:

  1. logrotate --version
Output
logrotate 3.8.7

如果未安装 Logrotate,您将收到错误消息。请使用 Linux 发行版的包管理器安装软件。

如果安装了 Logrotate 但版本号明显不同,则本教程中讨论的某些配置可能存在问题。通过阅读其 man 页面,参考您特定版本的 Logrotate 的文档:

  1. man logrotate

接下来我们将看看 Logrotate 在 Ubuntu 上的默认配置结构。

探索 Logrotate 配置

Logrotate的配置信息在Ubuntu上一般可以在两个地方找到:

  • /etc/logrotate.conf:此文件包含一些默认设置,并为一些不属于任何系统包的日志设置轮换。它还使用 include 语句从 /etc/logrotate.d 目录中的任何文件中提取配置。
  • /etc/logrotate.d/:这是您安装的任何需要日志轮换帮助的包将放置其 Logrotate 配置的地方。在标准安装中,您应该已经在此处拥有基本系统工具的文件,例如 apt、dpkg、rsyslog 等。

默认情况下,logrotate.conf 将配置每周日志轮换 (weekly),日志文件属于 root 用户和 syslog 组 (su root syslog),保留四个日志文件(rotate 4),并在当前日志文件轮换后创建新的空日志文件(create)。

让我们看一下/etc/logrotate.d中一个包的Logrotate配置文件。 cat apt 包实用程序的文件:

  1. 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 中设置的值。为 apt 日志设置的选项是:

  • rotate 12:保留十二个旧日志文件。
  • monthly:每月轮换一次。
  • compress:压缩旋转后的文件。这默认使用 gzip 并生成以 .gz 结尾的文件。可以使用 compresscmd 选项更改压缩命令。
  • missingok:如果日志文件丢失,不要写入错误消息。
  • notifempty:如果日志文件为空,则不轮换。

还有更多可用的配置选项。您可以通过在命令行中键入 man logrotate 来调出 Logrotate 的手册页来阅读所有这些内容。

接下来,我们将设置一个配置文件来处理虚构服务的日志。

设置示例配置

要管理预打包和预配置系统服务之外的应用程序的日志文件,我们有两种选择:

  1. 创建一个新的Logrotate 配置文件并将其放在/etc/logrotate.d/ 中。这将作为 root 用户与所有其他标准 Logrotate 作业一起每天运行。
  2. 创建一个新的配置文件并在 Ubuntu 的默认 Logrotate 设置之外运行它。只有当您需要以非 root 用户身份运行 Logrotate 时,或者如果您想比每天更频繁地轮换日志(/etc/logrotate.d 中的 hourly 配置),这才是真正必要的/ 将无效,因为系统的 Logrotate 设置每天只运行一次。

让我们通过一些示例设置来了解这两个选项。

将配置添加到 /etc/logrotate.d/

我们想为一个虚构的 Web 服务器配置日志轮换,该服务器将 access.log 和 error.log 放入 /var/log/example-app/。它作为 www-data 用户和组运行。

要向 /etc/logrotate.d/ 添加一些配置,首先在那里打开一个新文件:

  1. sudo nano /etc/logrotate.d/example-app

这是一个可以处理这些日志的示例配置文件:

/var/log/example-app/*.log {
	daily
	missingok
	rotate 14
	compress
	notifempty
	create 0640 www-data www-data
	sharedscripts
	postrotate
		systemctl reload example-app
	endscript
}

此文件中的一些新配置指令是:

  • create 0640 www-data www-data:这会在旋转后创建一个新的空日志文件,具有指定的权限 (0640),所有者 (www -data) 和组(也 www-data)。
  • sharedscripts:此标志意味着添加到配置的任何脚本每次运行仅运行一次,而不是针对每个旋转的文件运行一次。由于此配置会匹配 example-app 目录中的两个日志文件,因此如果没有此选项,postrotate 中指定的脚本将运行两次。
  • postrotate 到 endscript:此块包含在日志文件轮换后运行的脚本。在这种情况下,我们将重新加载示例应用程序。这有时是让您的应用程序切换到新创建的日志文件所必需的。 请注意,postrotate 在日志压缩之前运行。压缩可能需要很长时间,您的软件应立即切换到新的日志文件。对于需要在 日志压缩后运行的任务,请改用lastaction 块。

根据您的需要自定义配置并将其保存在 /etc/logrotate.d 中后,您可以通过试运行来测试它:

  1. sudo logrotate /etc/logrotate.conf --debug

这会调用 logrotate,将其指向标准配置文件,并打开调试模式。

信息将打印出有关 Logrotate 正在处理哪些日志文件以及它会对它们做什么的信息。如果一切顺利,你就完成了。标准的 Logrotate 作业将每天运行一次并包含您的新配置。

接下来,我们将尝试一个完全不使用 Ubuntu 默认配置的设置。

创建独立的 Logrotate 配置

在这个例子中,我们有一个应用程序作为我们的用户 sammy 运行,生成存储在 /home/sammy/logs/ 中的日志。我们希望每小时轮换这些日志,因此我们需要在 Ubuntu 提供的 /etc/logrotate.d 结构之外进行设置。

首先,我们将在我们的主目录中创建一个配置文件。在文本编辑器中打开它:

  1. nano /home/sammy/logrotate.conf

然后粘贴以下配置:

/home/sammy/logs/*.log {
	hourly
	missingok
	rotate 24
	compress
	create
}

保存并关闭文件。我们已经在前面的步骤中看到了所有这些选项,但让我们总结一下:此配置将每小时轮换文件,压缩并保留 24 个旧日志,并创建一个新的日志文件来替换轮换的日志文件。

您需要自定义配置以适合您的应用程序,但这是一个好的开始。

为了测试它是否有效,让我们创建一个日志文件:

  1. cd ~
  2. mkdir logs
  3. touch logs/access.log

现在我们在正确的位置有了一个空白日志文件,让我们运行 logrotate 命令。

因为日志归 sammy 所有,所以我们不需要使用 sudo。不过,我们确实需要指定一个状态文件。这个文件记录了 logrotate 上次运行时看到和做了什么,以便它知道下次运行时要做什么。这是在使用 Ubuntu Logrotate 设置时为我们处理的(可以在 /var/lib/logrotate/status 找到),但我们现在需要手动完成。

对于这个例子,我们会让 Logrotate 将状态文件放在我们的主目录中。我可以去任何方便的地方:

logrotate /home/sammy/logrotate.conf --state /home/sammy/logrotate-state --verbose
Output
reading 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 第一次看到这个日志文件,据它所知,这个文件是零小时的,不应该被轮换。

如果我们查看状态文件,我们会看到 Logrotate 记录了一些关于运行的信息:

  1. cat /home/sammy/logrotate-state
Output
logrotate state -- version 2 "/home/sammy/logs/access.log" 2017-11-7-19:0:0

Logrotate 记录了它看到的日志以及它最后一次考虑轮换它们的时间。如果我们在一小时后运行相同的命令,日志将按预期轮换。

如果你想强制 Logrotate 旋转日志文件,否则它不会旋转,请使用 --force 标志:

  1. logrotate /home/sammy/logrotate.conf --state /home/sammy/logrotate-state --verbose --force

这在测试 postrotate 和其他脚本时很有用。

最后,我们需要设置一个 cron 作业来每小时运行一次 Logrotate。打开用户的 crontab:

  1. crontab -e

这将打开一个文本文件。文件中可能已经有一些注释解释了预期的基本语法。将光标向下移动到文件末尾的新空白行并添加以下内容:

crontab
14 * * * * /usr/sbin/logrotate /home/sammy/logrotate.conf --state /home/sammy/logrotate-state

此任务将在每天每小时的第 14 分钟运行。它运行的 logrotate 命令与我们之前运行的基本相同,尽管我们将 logrotate 扩展到它的完整路径 /usr/sbin/logrotate 只是为了安全的。在编写 cron 作业时尽可能明确是一种很好的做法。

保存文件并退出。这将安装 crontab,我们的任务将按指定的时间表运行。

如果我们在大约一个小时后重新访问我们的日志目录,我们应该找到旋转和压缩的日志文件 access.log.1.gz(如果您运行 Logrotate,则为 .2.gz使用 --force 标志)。

结论

在本教程中,我们验证了我们的 Logrotate 版本,探索了默认的 Ubuntu Logrotate 配置,并设置了两种不同类型的自定义配置。要了解有关 Logrotate 可用的命令行和配置选项的更多信息,您可以通过在终端中运行 man logrotate 来阅读其手册页。

©2015-2025 艾丽卡 support@alaica.com