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

介绍

Logrotate 是一个管理日志文件自动旋转和压缩的系统实用程序,如果日志文件没有被旋转,压缩和定期切割,它们最终可以消耗系统上所有可用的磁盘空间。

Logrotate 默认安装在 Ubuntu 22.04 上,并设置为处理所有安装包的日志旋转需求,包括rsyslog,即默认系统日志处理器。

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

前提条件

本教程假设您有一个 Ubuntu 22.04 服务器,具有非 root sudo 启用的用户,如在 Ubuntu 22.04 初始服务器设置中所述。

Logrotate 也可在许多其他 Linux 发行版上使用,但默认配置可能完全不同。本教程的其他部分将继续应用,只要您的 Logrotate 版本与 Ubuntu 22.04 类似。

登录您的服务器作为您的 sudo 启用用户开始。

步骤 1 – 确认您的 Logrotate 版本

Logrotate 默认安装在 Ubuntu 上,但是,如果您需要安装它,请运行以下命令来更新您的包列表并获取包:

1sudo apt update
2sudo apt install logrotate

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

1logrotate --version
 1[secondary_label Output]
 2logrotate 3.19.0
 3
 4    Default mail command:       /usr/bin/mail
 5    Default compress command:   /bin/gzip
 6    Default uncompress command: /bin/gunzip
 7    Default compress extension: .gz
 8    Default state file path:    /var/lib/logrotate/status
 9    ACL support:                yes
10    SELinux support:            yes

如果安装了 Logrotate,但版本号显著不同,您可能会遇到在本教程中探索的一些配置选项的问题。

1man logrotate

您还可以参阅Logrotate文档的在线版本(LINK0),接下来我们将看看Logrotate在Ubuntu上的默认配置结构。

步骤 2 – 探索 Logrotate 配置

Logrotate的配置信息通常可以在Ubuntu的两个地方找到:

  • /etc/logrotate.conf:此文件包含一些默认设置,并为一些不是任何系统包的日志设置旋转。它还使用一个 include 语句从 /etc/logrotate.d 目录中的任何文件中拉入配置。
  • /etc/logrotate.d:这是你安装需要帮助的日志旋转的任何包将放置他们的 Logrotate 配置的地方。 在标准安装中,你应该已经有文件在这里为核心系统工具,如 apt, dpkg, rsyslog 等。

默认情况下,logrotate.conf 将配置每周日志旋转,日志文件由 root 用户和 syslog 组所有,同时保留四个日志文件(旋转 4)和创建新的空日志文件(创建)。

让我们看看一个包的 Logrotate 配置文件在 /etc/logrotate.d

1cat /etc/logrotate.d/apt
 1[secondary_label Output]
 2/var/log/apt/term.log {
 3  rotate 12
 4  monthly
 5  compress
 6  missingok
 7  notifempty
 8}
 9
10/var/log/apt/history.log {
11  rotate 12
12  monthly
13  compress
14  missingok
15  notifempty
16}

此檔案包含「/var/log/apt/」目錄中的兩個不同的日志檔案的配置塊:『term.log』和『history.log』. 兩者都具有相同的選項。 任何在這些配置塊中未設定的選項都會繼承預設值或在『/etc/logrotate.conf』中設定的值。 任何 logrotate 檔案的設定都會超過 logrotate 的預設值,這些選項都設定在『/etc/logrotate.conf』中。

  • rotate 12:保留十二个旧日志文件. 这取代了 rotate 4 默认值.
  • monthly: rotate 每月一次. 这取代了 weekly 默认值.
  • compress:压缩旋转的文件. 默认情况下使用 gzip 并导致文件以 .gz 结束。 压缩命令可以使用 compresscmd 选项更改。
  • missingok:如果日志文件缺少,请不要写错误消息.
  • notifempty:如果日志文件空白,请不要旋转日志文件。

这些配置文件还继承了默认的创建行为,该行为指示Logrotate在旋转后创建新日志。

有许多更多的配置选项可用. 您可以通过在命令行上键入man logrotate来阅读所有这些选项,以将Logrotate的手册页面引入。

接下来,我们将设置一个配置文件来处理一个名为你的应用程序的虚构服务的日志。

步骤 3 – 设置示例配置

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

  1. 创建一个新的 Logrotate 配置文件,并将其放置在 /etc/logrotate.d/. 这将作为 root 用户每天运行,以及所有其他标准的 Logrotate 工作。
  2. 创建一个新的配置文件,并在 Ubuntu 的默认 Logrotate 设置之外运行。

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

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

我们想为虚构的 Web 服务器配置日志旋转,将access.logerror.log放入/var/log/your-app/中。

若要将您的应用程序日志文件添加到/etc/logrotate.d/,请先使用nano或您喜爱的编辑器在/etc/logrotate.d目录中打开新文件:

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

将以下行添加到新配置文件中:

 1[label /etc/logrotate.d/your-app]
 2/var/log/your-app/*.log {
 3    daily
 4    missingok
 5    rotate 14
 6    compress
 7    notifempty
 8    create 0640 www-data www-data
 9    sharedscripts
10    postrotate
11    	systemctl reload your-app
12    endscript
13}

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

  • 创建0640 www-data www-data':这在旋转后创建一个新的空日志文件,并有指定的权限(0640')、所有者(www-data')和组(也www-data')。
  • 共享标记 : 此旗帜表示添加到配置中的任何脚本只运行一次, 而不是每个文件旋转一次 。 由于 " /var/log/your-app/*.log " 路径包含通配符QQ,此配置将匹配 " Your-app " 目录中的任何数量日志文件。 如果没有 " 共享标记 " 选项,则在 " postrotate " 中指定的脚本将每次运行日志处理一个日志文件而不使用此选项。
  • postrotate' to endscript':此块包含一个在日志文件被旋转后运行的脚本. 在此情况下,我们正在重新装入我们的例子应用程序。 这有时对于使您的应用程序切换到新创建的日志文件是必要的 。 注意: " 后置 " 在日志压缩前运行。 压缩可能需要很长时间,您的软件应立即切换到新日志文件. 对于需要运行_after_日志被压缩的任务,取而代之的是最后行动块。 (英语)

要保存并停止nano,请按Ctrl+X,并在提示时按Y,然后按Enter

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

此命令调用logrotate,指向标准配置文件,并启用调试模式。

将打印有关 Logrotate 正在处理哪些日志文件的信息,以及它会对它们做什么。如果一切看起来都很好,你已经完成了。

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

步骤 4 – 创建一个独立的 Logrotate 配置

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

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

1nano /home/sammy/logrotate.conf

然后粘贴到以下配置:

1[label /home/sammy/logrotate.conf]
2/home/sammy/logs/*.log {
3    hourly
4    missingok
5    rotate 24
6    compress
7    create
8}

我们在以前的步骤中遇到过所有这些选项,但让我们总结一下:此配置将每小时旋转文件,压缩和保留二十四个旧日志,并创建一个新的日志文件来取代旋转的日志文件。

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

要测试配置是否有效,让我们创建一个日志文件。 首先使用cd ~命令将cd带到用户的主目录,然后使用mkdir命令为日志创建一个目录。 最后,使用touch命令在logs目录中创建一个空的文件。 执行下列命令以完成这些步骤:

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

现在我们有一个空的日志文件在正确的地方,让我们运行logrotate命令。

由于日志是由sammy所有,我们不需要使用sudo。然而,我们需要指定一个 state 文件。 此文件记录了logrotate发现的内容以及它上次运行时所采取的任何行动,以便它知道下次运行时该做什么。 此状态跟踪用于我们使用默认配置 /etc/logrotate.conf 时。 状态文件存储在 /var/lib/logrotate/status’ 中。 由于我们不使用默认配置,我们需要手动配置状态文件位置。

我们会让Logrotate将状态文件放到我们的主目录中以便为此示例。它可以去任何可访问和方便的地方。运行以下命令,使用您创建的 /home/sammy/logrotate.conf 并记录 logrotate 遇到的状态:

1logrotate /home/sammy/logrotate.conf --state /home/sammy/logrotate-state --verbose
1[secondary_label Output]
2reading config file /home/sammy/logrotate.conf
3
4Handling 1 logs
5
6rotating pattern: /home/sammy/logs/*.log hourly (24 rotations)
7empty log files are rotated, old logs are removed
8considering log /home/sammy/logs/access.log
9  log does not need rotating

--verbose旗帜将打印有关Logrotate正在做什么的详细信息,在这种情况下它没有旋转任何东西,这是Logrotate第一次遇到这个日志文件,它是零小时的,所以不应该旋转。

如果我们使用实用程序检查状态文件,我们会注意到Logrotate记录了一些关于跑步的信息:

1cat /home/sammy/logrotate-state
1[secondary_label Output]
2logrotate state -- version 2
3"/home/sammy/logs/access.log" 2022-07-2-19:0:0

Logrotate 注意到它看到的日志,以及它最后一次考虑它们为旋转时。

如果您想强迫 Logrotate 旋转日志文件,而它不这样做,请使用 `--force' 旗帜:

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

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

最后,我们需要设置一个 cron 任务,以便每小时运行 Logrotate。

1crontab -e

这将打开文本文件. 如果这是你第一次使用 cron,你可能会被要求选择默认文本编辑器. 如果你没有偏好,我们建议‘nano’给新用户. 可能已经在文件中有一些评论解释 cron语法。 将路由器移动到文件末尾的新空行,并添加以下内容:

1[secondary_label crontab]
214 * * * * /usr/sbin/logrotate /home/sammy/logrotate.conf --state /home/sammy/logrotate-state

它运行几乎相同的logrotate命令,我们之前运行,虽然我们扩展了logrotate到其完整的路径/usr/sbin/logrotate是安全的。

这将安装 crontab,我们的任务将按照指定的时间表运行。

如果我们在大约一个小时内重新访问我们的日志目录,我们应该找到旋转和压缩的日志文件 access.log.1.gz(或 .2.gz如果您运行了Logrotate与 --force旗帜)。

结论

在本教程中,我们验证了我们的Logrotate版本,探索了Ubuntu Logrotate的默认配置,并设置了两种不同类型的自定义配置。 要了解更多关于Logrotate的命令行和配置选项,您可以通过在终端运行man logrotate或访问在线文档(https://www.man7.org/linux/man-pages/man8/logrotate.8.html)来阅读其手册页面。

Published At
Categories with 技术
comments powered by Disqus