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

介绍

Logrotate是一个系统实用工具,用于管理日志文件的自动轮换和压缩。如果日志文件不进行轮换、压缩和定期修剪,它们最终可能会占用系统上所有可用的磁盘空间。

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

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

先决条件

本教程假设您有一个Ubuntu 22.04服务器,具有非根sudo启用用户,如使用Ubuntu 22.04进行初始服务器设置中描述的那样。

Logrotate也可以在许多其他Linux发行版上使用,但默认配置可能会有很大不同。只要您的Logrotate版本与Ubuntu 22.04的类似,本教程的其他部分仍将适用。请按照第1步来确定您的Logrotate版本。

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

步骤1 —— 确认您的Logrotate版本

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

  1. sudo apt update
  2. sudo apt install logrotate

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

  1. logrotate --version
Output
logrotate 3.19.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已安装但版本号明显不同,则可能会遇到本教程中探讨的某些配置选项的问题。请参考您的Logrotate版本的文档,方法是阅读其手册(man)页面:

  1. man logrotate

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

步骤2 —— 探索Logrotate配置

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

  • /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软件包实用程序的文件:

  1. 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的默认值,这些默认值在/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,或者希望比每日更频繁地旋转日志时,才真正需要这样做(在/etc/logrotate.d/中的hourly配置将无效,因为系统的Logrotate设置每天只运行一次)。

让我们通过一些示例设置来逐步介绍这两种选项。

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

我们想要为一个虚构的 Web 服务器配置日志轮转,它将access.logerror.log放在/var/log/your-app/目录中。它以www-data用户和组运行。

要为your-app日志文件添加配置到/etc/logrotate.d/,首先使用nano或您喜欢的编辑器在/etc/logrotate.d目录中打开一个新文件:

  1. 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选项,那么在没有此选项的情况下,postrotate中指定的脚本将在logrotate处理日志文件时每次运行一次。
  • postrotateendscript:此块包含在日志文件轮转后运行的脚本。在本例中,我们重新加载了我们的示例应用程序。有时需要这样做才能使应用程序切换到新创建的日志文件。请注意,postrotate在日志被压缩之前运行。压缩可能需要很长时间,您的软件应立即切换到新的日志文件。对于需要在日志被压缩后运行的任务,请改用lastaction块。

要保存并退出nano,按Ctrl+X,然后在提示时按Y,然后按Enter。您可以通过执行dry run来测试配置文件:

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

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

关于Logrotate正在处理哪些日志文件以及它们将如何处理的信息将被打印出来。如果一切正常,你就完成了。标准的Logrotate作业将每天运行一次,并包括你的新配置。

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

步骤4 —— 创建独立的Logrotate配置

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

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

  1. nano /home/sammy/logrotate.conf

然后粘贴以下配置:

/home/sammy/logrotate.conf
/home/sammy/logs/*.log {
	hourly
	missingok
	rotate 24
	compress
	create
}

保存并关闭文件。我们在之前的步骤中遇到了所有这些选项,但让我们总结一下:这个配置将每小时轮转文件,压缩并保留二十四个旧日志,并创建一个新的日志文件来替换被轮转的日志。

你需要根据你的应用程序自定义配置,但这是一个很好的开始。

为了测试配置是否有效,让我们创建一个日志文件。首先使用cd ~命令切换到用户的主目录。然后使用mkdir命令创建一个用于存储日志的目录。最后,在logs目录中创建一个空文件。按照以下步骤运行这些命令:

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

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

由于日志的所有者是sammy,我们不需要使用sudo。但是,我们确实需要指定一个状态文件。该文件记录了上次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
Output
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第一次遇到这个日志文件,它的年龄为零小时,因此不应该旋转。

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

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

Logrotate注意到它看到的日志以及上次考虑它们进行旋转的时间。如果我们一个小时后运行相同的命令,日志将按预期进行旋转。

如果您想强制Logrotate在否则不会旋转日志文件时旋转日志文件,请使用--force标志:

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

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

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

  1. crontab -e

这将打开一个文本文件。如果这是您第一次使用cron,可能会提示您选择默认的文本编辑器。如果您没有偏好,我们建议新用户使用nano。文件中可能已经有一些注释,解释了cron语法。将光标移动到文件末尾的新空白行处,并添加以下内容:

crontab
14 * * * * /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,或访问在线文档

Source:
https://www.digitalocean.com/community/tutorials/how-to-manage-logfiles-with-logrotate-on-ubuntu-22-04