如何在Ubuntu16.04上使用Logrotate管理日志文件

来自菜鸟教程
跳转至:导航、​搜索

介绍

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

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

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

先决条件

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

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

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

确认您的 Logrotate 版本

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

logrotate --version
Outputlogrotate 3.8.7

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

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

man logrotate

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

探索 Logrotate 配置

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

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

默认情况下,logrotate.conf 将配置每周日志轮换(weekly),日志文件由 root 用户和 syslog 组([X149X ]),保留四个日志文件(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 中设置的值。 为 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,或者如果您希望比每天更频繁地轮换日志([X180X 中的 hourly 配置),这才是真正必要的] 将无效,因为系统的 Logrotate 设置每天只运行一次)。

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

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

我们想为将 access.logerror.log 放入 /var/log/example-app/ 的虚构 Web 服务器配置日志轮换。 它以 www-data 用户和组的身份运行。

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

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

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

/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 中指定的脚本将在没有此选项的情况下运行两次。
  • postrotateendscript:此块包含在日志文件轮换后运行的脚本。 在这种情况下,我们正在重新加载我们的示例应用程序。 这有时对于让您的应用程序切换到新创建的日志文件是必要的。 请注意,postrotate 在日志压缩之前运行。 压缩可能需要很长时间,您的软件应立即切换到新的日志文件。 对于需要在 日志压缩后运行 的任务,请改用 lastaction 块。

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

sudo logrotate /etc/logrotate.conf --debug

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

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

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

创建独立的 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 ~
mkdir logs
touch logs/access.log

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

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

对于此示例,我们将让 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 第一次看到这个日志文件,据它所知,该文件是零小时的,不应该轮换。

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

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

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

如果您想强制 Logrotate 轮换日志文件,否则请使用 --force 标志:

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

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

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

crontab -e

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

crontab14 * * * * /usr/sbin/logrotate /home/sammy/logrotate.conf --state /home/sammy/logrotate-state

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

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

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

结论

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