网站搜索

如何在 Linux 中使用 Logrotate 设置和管理日志轮转


Linux 系统中最有趣(也许也是最重要的目录之一)的目录是 /var/log。根据文件系统层次结构标准,系统中运行的大多数服务的活动都会写入此目录或其子目录之一内的文件中。

此类文件称为日志,是检查系统如何运行(以及它过去的行为方式)的关键。 日志也是管理员和工程师在故障排除时查看的第一个信息来源。

如果我们在 CentOS/RHEL/FedoraDebian/Ubuntu(对于各种情况)上查看 /var/log 的内容,我们将看到以下日志文件和子目录。

请注意,根据您的系统上运行的服务及其运行时间,结果可能会有所不同。

在 RHEL/CentOS 和 Fedora 中

ls /var/log

在 Debian 和 Ubuntu 中

ls /var/log

在这两种情况下,我们可以观察到一些日志名称按预期以 “log ” 结尾,而其他日志名称则使用日期重命名(例如,maillog-20160822CentOS 上)或压缩(考虑 Debianauth.log.2.gzmysql.log.1.gz强>)。

这不是基于所选发行版的默认行为,但可以使用配置文件中的指令随意更改,正如我们将在本文中看到的那样。

如果日志永远保留,它们最终会填满 /var/log 所在的文件系统。为了防止这种情况发生,系统管理员可以使用一个名为 logrotate 的实用程序来定期清理日志。

简而言之,logrotate 将在满足条件时重命名或压缩主日志(稍后会详细介绍),以便将下一个事件记录在空文件中。

此外,它将删除“旧”日志文件并保留最新的日志文件。当然,我们可以决定“old”的含义以及我们希望 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) 可能表明其他更具体的设置可能放置在各个 .conf 文件中/etc/logrotate.d

当且仅当以下行存在并且未被注释掉时才会出现这种情况:

include /etc/logrotate.d

我们将坚持使用这种方法,因为它将帮助我们保持秩序,并在以下示例中使用 Debian 框。

在 Linux 中配置 Logrotate

作为一个非常通用的工具,logrotate 提供了大量的指令来帮助我们配置日志轮换的时间和方式,以及之后应该发生什么。

让我们在 /etc/logrotate.d/apache2.conf 中插入以下内容(请注意,您很可能必须创建该文件)并检查每一行以表明其用途:

/var/log/apache2/* {
    weekly
    rotate 3
    size 10M
    compress
    delaycompress
}

第一行表示块内的指令适用于 /var/log/apache2 内的所有日志:

  • 每周表示该工具将尝试每周轮换日志。其他可能的值是每日和每月。
  • rotate 3表示只应保留3个旋转日志。因此,最旧的文件将在第四次后续运行时被删除。
  • size=10M 将进行旋转的最小大小设置为 10M。换句话说,每个日志在达到 10MB 之前不会进行轮转。
  • compressdelaycompress 用于指示所有轮换日志(最近的日志除外)都应该被压缩。

让我们执行一次试运行,看看如果现在实际执行 logrotate 会做什么。使用 -d 选项,后跟配置文件(您实际上可以通过省略此选项来运行 logrotate):

logrotate -d /etc/logrotate.d/apache2.conf

结果如下所示:

我们可以在轮换日志的日期之后重命名它们,而不是压缩日志。为此,我们将使用 dateext 指令。如果我们的日期格式不是默认的yyyymmdd,我们可以使用dateformat指定它。

请注意,如果日志为空,我们甚至可以使用 notifempty 来阻止轮换的发生。此外,让我们告诉 logrotate 将轮换日志邮寄给系统管理员(在本例中为[email )供他/她参考(这需要设置邮件服务器,即超出了本文的范围)。

如果您想获取有关 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 [email 
}

如下图所示,该日志不需要旋转。但是,当满足大小条件(size=1M)时,轮换的日志将被重命名为access.log-25082020(如果日志是在8月轮换的) 2020 年 2 月 25 日)和主日志 (access.log) 将重新创建,访问权限设置为 0644 并使用 root

最后,当日志数量最终达到 6 时,最旧的日志将被邮寄到 [email 

现在假设您想在旋转发生时运行自定义命令。为此,请将包含此类命令的行放在 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 am开始执行。

否则,执行将在上午 7:35 左右开始。要进行验证,请注意 /etc/crontab/etc/anacrontab 中包含 cron.daily 的行。

概括

在生成多个日志的系统中,使用 logrotate 可以大大简化此类文件的管理。正如我们在本文中所解释的,它将定期或当文件达到给定大小时自动轮换、压缩、删除和邮寄日志。

只需确保将其设置为作为 cron 作业运行,logrotate 将使事情变得更容易。有关更多详细信息,请参阅手册页。

您对本文有任何疑问或建议吗?请随时使用下面的评论表告诉我们。