如何在 Linux 中使用 Logrotate 设置和管理日志轮换
Linux 系统中一个最有趣(也可能是最重要的)的目录是/var/log
。 根据文件系统层次标准,系统中运行的大多数服务的活动都写入此目录或其子目录之一中的文件。
这些文件称为日志,是检查系统运行情况(以及过去的行为方式)的关键。日志也是管理员和工程师在排除故障时查看的第一个信息来源。
如果我们查看CentOS/RHEL/Fedora和Debian/Ubuntu/var/log
(为了多样化)上的内容,我们将看到以下日志文件和子目录。
请注意,根据您系统上运行的服务及其运行时间,结果可能会有所不同。
在 RHEL/CentOS 和 Fedora 中
# ls /var/log
在 Debian 和 Ubuntu 中
# ls /var/log
在这两种情况下,我们可以观察到一些日志名称以“log”为预期结尾,而其他日志名称则使用日期重命名(例如,CentOS上的maillog-20160822)或压缩(考虑Debian上的auth.log.2.gz和mysql.log.1.gz)。
这不是基于所选分布的默认行为,但可以使用配置文件中的指令随意更改,正如我们将在本文中看到的那样。
如果日志被永久保存,它们最终会填满/var/log所在的文件系统。为了防止这种情况发生,系统管理员可以使用一个名为logrotate的实用工具定期清理日志。
简而言之,当满足某个条件时(稍后会详细介绍), logrotate会重命名或压缩主日志,以便下一个事件记录在一个空文件中。
此外,它还会删除“旧”日志文件并保留最新的日志文件。当然,我们可以决定“旧”的含义以及我们希望 logrotate 为我们清理日志的频率。
在 Linux 中安装 Logrotate
要安装logrotate,只需使用你的包管理器:
---------- On Debian and Ubuntu ---------- # aptitude update && aptitude install logrotate ---------- On CentOS, RHEL and Fedora ---------- # yum update && yum install logrotate
值得注意的是,配置文件(/etc/logrotate.conf
)可能表明其他更具体的设置可以放在/etc/logrotate.d.conf
内的各个文件中。
当且仅当以下行存在且未被注释掉时,才会出现这种情况:
include /etc/logrotate.d
我们将坚持这种方法,因为它将帮助我们保持秩序,并使用Debia n 框作为以下示例。
在 Linux 中配置 Logrotate
作为一款用途非常广泛的工具,logrotate 提供了大量指令来帮助我们配置何时以及如何轮换日志,以及之后应该发生什么。
让我们在/etc/logrotate.d/apache2.conf中插入以下内容(请注意,您很可能必须创建该文件)并检查每一行以表明其用途:
/var/log/apache2/* { weekly rotate 3 size 10M compress delaycompress }
第一行表示块内的指令适用于/var/log/apache2内的所有日志:
- weekly表示该工具将尝试每周轮换日志。其他可能的值包括 daily 和 monthly。
- rotate 3表示只应保留 3 个轮换日志。因此,最旧的文件将在第四次后续运行中被删除。
- size=10M将轮换的最小大小设置为 10M。换句话说,每个日志在达到 10MB 之前不会轮换。
- compress和delaycompress用于指示除最新的日志之外的所有旋转日志都应该被压缩。
让我们执行一次试运行,看看现在实际执行 logrotate 时会做什么。使用-d
配置文件后面的选项(实际上,您可以省略此选项来运行 logrotate):
# logrotate -d /etc/logrotate.d/apache2.conf
结果如下所示:
我们可以不压缩日志,而是根据日志轮换的日期重命名它们。为此,我们将使用dateext
指令。如果我们的日期格式不是默认的yyyymmdd,我们可以使用dateformat指定它。
请注意,如果日志为空,我们甚至可以使用notifempty来阻止轮换的发生。此外,让我们告诉 logrotate 将轮换后的日志邮寄给系统管理员(在本例中为gabriel@mydomain.com)以供他/她参考(这需要设置邮件服务器,这超出了本文的范围)。
如果你想获取有关 logrotate 的电子邮件,你可以设置 Postfix 邮件服务器,如下所示:安装 Postfix 邮件服务器
这次我们将使用/etc/logrotate.d/squid.conf仅旋转/var/log/squid/access.log:
/var/log/squid/access.log { monthly create 0644 root root rotate 5 size=1M dateext dateformat -%d%m%Y notifempty mail gabriel@mydomain.com }
如下图所示,此日志无需轮换。但是,当满足大小条件(size=1M)时,轮换后的日志将重命名为access.log-25082020(如果日志是在2020 年 8 月 25 日轮换的),并且将重新创建主日志 ( access.log ),访问权限设置为0644 ,所有者和组所有者为root 。
最后,当日志数量最终达到6时,最旧的日志将邮寄至gabriel@mydomain.com。
现在假设您想要在旋转时运行自定义命令。为此,请将包含此类命令的行放在 postrotate 和 endscript 指令之间。
例如,假设我们想在/var/log/myservice中的任何日志轮换时向 root 发送电子邮件。我们将红色行添加到/etc/logrotate.d/squid.conf:
/var/log/myservice/* { monthly create 0644 root root rotate 5 size=1M postrotate echo "A rotation just took place." | mail root endscript }
最后,但并非最不重要的一点是,需要注意的是,/etc/logrotate.d/*.conf
如果发生冲突,存在的选项将覆盖主配置文件中的选项。
Logrotate 和 Cron
默认情况下,安装 logrotate 时会在/etc/cron.daily中创建一个名为logrotate的 crontab 文件。与此目录中的其他 crontab 文件一样,如果未安装 anacron,它将每天从上午 6:25开始执行。
否则,执行将在上午 7:35左右开始。要验证,请在/etc/crontab或/etc/anacrontab中查看包含cron.daily的行。
概括
在生成多个日志的系统中,使用 logrotate 可以大大简化此类文件的管理。正如我们在本文中所解释的那样,它会定期或当文件达到给定大小时自动轮换、压缩、删除和邮寄日志。
只需确保将其设置为 cron 作业运行,logrotate 将使事情变得更容易。有关更多详细信息,请参阅手册页。
您对本文有任何疑问或建议吗?请随时使用下面的评论表告诉我们。