介绍
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上。但是,如果您需要安装它,请运行以下命令来更新您的软件包列表并检索软件包:
如果您正在使用非Ubuntu服务器,请首先确保Logrotate已安装,方法是请求其版本信息:
Outputlogrotate 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
)页面:
您还可以参考Logrotate文档的在线版本。接下来,我们将查看Ubuntu上Logrotate的默认配置结构。
步骤2 —— 探索Logrotate配置
在Ubuntu上,Logrotate的配置信息通常可以在两个地方找到:
/etc/logrotate.conf
:此文件包含一些默认设置,并为一些不属于任何系统软件包的日志设置了轮换。它还使用一个include
语句从/etc/logrotate.d
目录中的任何文件中引入配置。/etc/logrotate.d/
:这是您安装的任何需要日志轮换帮助的软件包将其Logrotate配置放置的位置。在标准安装中,您应该已经在这里找到用于核心系统工具如apt
、dpkg
、rsyslog
等的文件。
默认情况下,logrotate.conf
将配置每周的日志轮换,日志文件由root用户和syslog组拥有,保留四个日志文件(rotate 4
),并在当前日志文件轮换后创建新的空日志文件(create
)。
让我们看一下/etc/logrotate.d
中某个软件包的Logrotate配置文件。 cat
用于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.log
和history.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管理应用程序的日志文件,可以选择预先打包和预先配置的系统服务之外的应用程序,我们有两个选项:
- 创建一个新的Logrotate配置文件,并将其放置在
/etc/logrotate.d/
目录中。这将作为root用户每日运行,以及所有其他标准的Logrotate作业。 - 创建一个新的配置文件,并在Ubuntu默认的Logrotate设置之外运行它。只有当您需要以非root用户身份运行Logrotate,或者希望比每日更频繁地旋转日志时,才真正需要这样做(在
/etc/logrotate.d/
中的hourly
配置将无效,因为系统的Logrotate设置每天只运行一次)。
让我们通过一些示例设置来逐步介绍这两种选项。
将配置添加到/etc/logrotate.d/
我们想要为一个虚构的 Web 服务器配置日志轮转,它将access.log
和error.log
放在/var/log/your-app/
目录中。它以www-data
用户和组运行。
要为your-app
日志文件添加配置到/etc/logrotate.d/
,首先使用nano
或您喜欢的编辑器在/etc/logrotate.d
目录中打开一个新文件:
将以下行添加到您的新配置文件中:
/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处理日志文件时每次运行一次。postrotate
到endscript
:此块包含在日志文件轮转后运行的脚本。在本例中,我们重新加载了我们的示例应用程序。有时需要这样做才能使应用程序切换到新创建的日志文件。请注意,postrotate
在日志被压缩之前运行。压缩可能需要很长时间,您的软件应立即切换到新的日志文件。对于需要在日志被压缩后运行的任务,请改用lastaction
块。
要保存并退出nano
,按Ctrl+X
,然后在提示时按Y
,然后按Enter
。您可以通过执行dry run来测试配置文件:
此命令调用logrotate
,指向标准配置文件,并打开调试模式。
关于Logrotate正在处理哪些日志文件以及它们将如何处理的信息将被打印出来。如果一切正常,你就完成了。标准的Logrotate作业将每天运行一次,并包括你的新配置。
接下来,我们将尝试一个完全不使用Ubuntu默认配置的设置。
步骤4 —— 创建独立的Logrotate配置
在这个例子中,我们有一个作为我们的用户sammy
运行的应用程序,生成的日志存储在/home/sammy/logs/
中。我们希望每小时轮转这些日志,因此我们需要在Ubuntu提供的/etc/logrotate.d
结构之外设置这个。
首先,我们将在我们的家目录中创建一个配置文件。用文本编辑器打开它:
然后粘贴以下配置:
/home/sammy/logs/*.log {
hourly
missingok
rotate 24
compress
create
}
保存并关闭文件。我们在之前的步骤中遇到了所有这些选项,但让我们总结一下:这个配置将每小时轮转文件,压缩并保留二十四个旧日志,并创建一个新的日志文件来替换被轮转的日志。
你需要根据你的应用程序自定义配置,但这是一个很好的开始。
为了测试配置是否有效,让我们创建一个日志文件。首先使用cd ~
命令切换到用户的主目录。然后使用mkdir
命令创建一个用于存储日志的目录。最后,在logs
目录中创建一个空文件。按照以下步骤运行这些命令:
现在我们在正确的位置有了一个空白的日志文件,让我们运行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
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记录了一些有关运行的信息:
Outputlogrotate state -- version 2
"/home/sammy/logs/access.log" 2022-07-2-19:0:0
Logrotate注意到它看到的日志以及上次考虑它们进行旋转的时间。如果我们一个小时后运行相同的命令,日志将按预期进行旋转。
如果您想强制Logrotate在否则不会旋转日志文件时旋转日志文件,请使用--force
标志:
在测试postrotate
和其他脚本时,这很有用。
最后,我们需要设置一个cron作业,每小时运行Logrotate。打开您用户的crontab:
这将打开一个文本文件。如果这是您第一次使用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
,或访问在线文档。