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

Logrotate是一个管理日志文件自动旋转和压缩的系统工具。如果日志文件没有被轮转,压缩和定期修剪,它们最终将占用系统上所有可用的磁盘空间。在本文中,我们将探索默认的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
logrotate 3.8.7

如果Logrotate没有安装,你会得到一个错误。 请使用您Linux发行版的软件包管理器安装软件。

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

man logrotate

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

探索Logrotate配置

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

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

默认情况下, logrotate.conf将配置每周的日志轮换( weekly ),拥有root用户和系统日志组( su root syslog )的日志文件,保留四个日志文件( rotate 4 ),新的空日志文件在当前一个被旋转( create )之后create

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

cat /etc/logrotate.d/apt
/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 :保留12个旧的日志文件。
  • monthlymonthly轮换一次。
  • compress :压缩旋转的文件。 默认情况下使用gzip ,结果是以.gz结尾的文件。 压缩命令可以使用compresscmd选项进行更改。
  • missingok :如果日志文件丢失,请勿写入错误消息。
  • notifempty :如果日志文件为空,则不要旋转日志文件。

还有更多可用的配置选项。 你可以通过在命令行输入man logrotate来打开Logrotate的手册页。

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

设置示例配置

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

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

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

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

我们要为虚拟Web服务器配置日志轮转,将access.logerror.log放入/var/log/example-app/ 它作为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指定的脚本将运行两次而不使用此选项。
  • endscript to endscript :这个块包含一个脚本,在日志文件旋转后运行。 在这种情况下,我们正在重新加载示例应用程序。 这有时是让您的应用程序切换到新创建的日志文件所必需的。 请注意, 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 我们确实需要指定一个状态文件。 这个文件记录了logrotate在上次运行时看到和做了什么,以便下一次运行时知道该怎么做。 在使用Ubuntu Logrotate设置(可以在/var/lib/logrotate/status )的情况下,我们可以处理这个问题,但是我们现在需要手动完成。

我们将把Logrotate的状态文件放在我们的主目录中。 我可以去任何方便和便利的地方

logrotate /home/sammy/logrotate.conf --state /home/sammy/logrotate-state --verbose
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记录了有关运行的一些信息:

cat /home/sammy/logrotate-state
logrotate 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

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

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

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

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

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

结论

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


分享按钮