如何在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 配置的位置。 在标准安装中,您应该已经在此处拥有 aptdpkgrsyslog 等核心系统工具的文件。

默认情况下,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.loghistory.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 为预打包和预配置的系统服务之外的应用程序管理日志文件,我们有两种选择:

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

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

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

我们想为将 access.logerror.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 中指定的脚本都会运行。
  • postrotateendscript:此块包含在日志文件轮换后运行的脚本。 在这种情况下,我们正在重新加载我们的示例应用程序。 这有时对于让您的应用程序切换到新创建的日志文件是必要的。 请注意,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 或访问 在线文档 来阅读其手册页。