Linux系统中最有趣的(可能也是最重要的)目录之一是/var/log。根据文件系统层次结构标准,在系统中运行的大多数服务的活动都被写到这个目录或它的子目录中的一个文件中。
这些文件被称为日志,是检查系统如何运行(以及它在过去如何运行)的关键。日志也是管理员和工程师在进行故障排除时查看的第一个信息源。
如果我们在CentOS/RHEL/Fedora和Debian/Ubuntu上查看/var/log的内容,我们会看到以下日志文件和子目录。
请注意,根据您系统上运行的服务及其运行时间的不同,结果可能会有所不同。
在RHEL/CentOS和Fedora
# ls /var/log
在 Debian 和 Ubuntu
linuxmi@linuxmi:~/www.linuxmi.com$ ls /var/log
linuxmi@linuxmi:~/www.linuxmi.com$ ls /var/log
alternatives.log.3.gz dmesg.1.gz syslog.1
alternatives.log.4.gz dmesg.2.gz syslog.2.gz
alternatives.log.5.gz dmesg.3.gz syslog.3.gz
alternatives.log.6.gz dmesg.4.gz syslog.4.gz
apache2 dpkg.log syslog.5.gz
apport.log dpkg.log.1 syslog.6.gz
apport.log.1 dpkg.log.2.gz syslog.7.gz
在这两种情况下,我们可以观察到一些日志名称如预期的那样以“log”结尾,而其他的日志名称要么使用日期重命名(例如CentOS上的maillog-20201103),要么被压缩(考虑Debian上的dpkg.log.2.gz syslog.7.gz和dpkg.log.1 syslog.6.gz)。
这不是基于所选发行版的默认行为,但可以使用配置文件中的指令随意更改,我们将在本文中看到。
如果日志是永久保存的,它们最终会填充/var/log所在的文件系统。为了防止这种情况发生,系统管理员可以使用一个名为logrotate的实用程序定期清理日志。
简单地说,logrotate将在满足条件时重命名或压缩主日志(稍后将详细介绍),以便将下一个事件记录在一个空文件中。
此外,它将删除“旧的”日志文件,并保留最新的日志文件。当然,我们需要决定“old”是什么意思,以及希望logrotate多久清理一次日志。
在Linux中安装Logrotate
要安装logrotate,只需使用包管理器:
———- 在 Debian 和 Ubuntu 上 ———-
linuxmi@linuxmi:~/www.linuxmi.com$ sudo aptitude update
linuxmi@linuxmi:~/www.linuxmi.com$ sudo aptitude install logrotate
———- 在 CentOS, RHEL 和 Fedora 上———-
# yum update && yum install logrotate
值得注意的是,配置文件(/etc/ logrotate.d)可能表明,其他更具体的设置可能放置在/etc/logrotate.d中的各个.conf文件上。
当且仅当以下行存在并且没有被注释掉时,情况才会如此:
include /etc/logrotate.d
我们将使用这种方法,因为它将帮助我们保持秩序井然,并在下面的示例中使用Debia。
在Linux中配置Logrotate
logrotate是一种非常通用的工具,它提供了很多指令来帮助我们配置日志的轮换时间和方式,以及随后应进行的操作。
让我们在/etc/logrotate.d/apache2.conf中插入以下内容(注意,很可能必须创建该文件),并检查每一行以表明其目的:
apache2.conf
/var/log/apache2/* { weekly rotate 3 size 10M compress delaycompress }
第一行表明该块内的指令适用于/var/log/apache2内的所有日志:
- weekly意味着该工具将尝试每周轮换一次日志。其他可能的值是每日和每月。
- 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中:
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 am左右开始。要进行验证,请在/ etc / crontab或/ etc / anacrontab中注意包含cron.daily的行。
概要
在生成多个日志的系统中,使用logrotate可以大大简化此类文件的管理。正如我们在本文中所解释的,它将定期或在文件达到给定大小时自动旋转,压缩,删除和邮寄日志。
只需确保将其设置为作为cron作业运行,然后进行logrotate可使事情变得简单得多。有关更多详细信息,请参见手册页。
您对本文有任何疑问或建议吗?请使用下面的评论表格随时告诉我们。