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

介绍

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

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

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

前提条件

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

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

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

确认您的 Logrotate 版本

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

1logrotate --version
1[secondary_label Output]
2logrotate 3.8.7

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

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

1man logrotate

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

探索Logrotate配置

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

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

默认情况下,logrotate.conf 会配置每周的日志旋转(每周),由 root 用户和 syslog 组所有的日志文件(su root syslog),四个日志文件被保留(rotate 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』中設定的值。

●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●

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

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

创建一个 Config 示例

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

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

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

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

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

若要将某些配置添加到 /etc/logrotate.d/,请先在那里打开一个新的文件:

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

以下是可以处理这些日志的例子 config 文件:

 1[label /etc/logrotate.d/example-app]
 2/var/log/example-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 example-app
12    endscript
13}

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

  • create 0640 www-data www-data:这在旋转后创建了一个新的空白日志文件,具有指定的权限(0640),所有者(www-data),和组(也称为 www-data)。
  • sharedscripts:这个标志意味着任何添加到配置的脚本只运行一次,而不是每个文件被旋转后运行一次。由于这个配置将匹配‘例子应用’目录中的两个日志文件,在 postrotate 中指定的脚本将运行两次,而没有此选项
  • rotpostateendcript:此块包含一个脚本在文件日志被旋转后运行。在这种情况下,我们将重新读取我们的示例应用程序。

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

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

这会调用logrotate,指向标准配置文件,并启用调试模式。

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

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

创建一个独立的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}

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

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

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

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

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

由于日志是由 sammy所有,我们不需要使用sudo。我们需要指定一个 state 文件,尽管如此,这个文件记录了logrotate上一次运行时所看到的内容,以便它知道下一次运行时该做什么。

我们将有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" 2017-11-7-19:0:0

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

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

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

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

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

1crontab -e

这将打开一个文本文件. 可能已经在文件中有一些评论解释预期的基本语法. 将指针移动到文件末尾的新空行,并添加以下内容:

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

该任务将在每小时的第14分钟运行,每天运行,它基本上运行与我们之前运行的logrotate命令相同,尽管我们将logrotate扩展到其完整的/usr/sbin/logrotate路径,只是为了安全。

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

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

结论

在本教程中,我们验证了我们的Logrotate版本,探索了Ubuntu Logrotate的默认配置,并设置了两种不同类型的自定义配置。

Published At
Categories with 技术
comments powered by Disqus