如何使用 Logrotate 切割日志

logrotate 可以管理日志文件,可以根据日期切割、根据日志文件大小切割、自动删除超过一定时间的归档日志。

安装

测试环境为 。

CentOS Linux release 8.2.2004 (Core) 

其他系统类似,请先检查 logrotate 是否安装,一切以文档为准。

man logrotate

使用

首先创建一个日志文件。

mkdir /var/log/logrotate-test

# 创建日志文件,并添加一些信息
seq 10 > /var/log/logrotate-test/access.log

创建 logrotate 配置文件,格式是这样的。

日志文件绝对路径(可以使用通配符*) {
	指令1
	指令2
	...
}

logrotate 全局配置文件位于 /etc/logrotate.conf ,自定义配置文件位于 /etc/logrotate.d/

一个具体的例子,表示每天切割日志,并压缩存档,最多保存5份存档(按时间排序,较早的删除),切割日志后自动创建新的日志文件,存档日志以时间为后缀。

> vim /etc/logrotate.d/logrotate-test

/var/log/logrotate-test/access.log {
	daily
	compress
	rotate 5
	create
	dateext
}

由于定时任务未到,需要手动通知 logrotate 执行切割任务。

logrotate -vf /etc/logrotate.d/logrotate-test
> ll /var/log/logrotate-test

total 4
-rw-r--r--. 1 root root  0 Nov 13 20:17 access.log
-rw-r--r--. 1 root root 41 Nov 13 20:15 access.log-20201113.gz

基本使用就是这样,为了验证,你可以等待几天看看切割结果。除此之外, logrotate 还有其他指令,比如可以在每次切割后执行命令,这里往日志文件添加新的记录。

/var/log/logrotate-test/access.log {
	daily
	compress
	rotate 5
	create
	dateext
	postrotate
        seq 10 > /var/log/logrotate-test/access.log
    endscript
}

Logrotate 如何运行

logrotate 是通过 cron 定时任务实现的。

> cat /etc/cron.daily/logrotate

#!/bin/sh

/usr/sbin/logrotate /etc/logrotate.conf
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
    /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit $EXITVALUE

每天都会执行一次 /usr/sbin/logrotate /etc/logrotate.conf /etc/logrotate.conf 文件包含了 /etc/logrotate.d/ ,所以所有的配置文件都会执行一遍,执行时根据具体配置决定是否切割。

试着手动执行一下该命令。

logrotate -v /etc/logrotate.conf

在输出中显示。

rotating pattern: /var/log/logrotate-test/access.log  after 1 days (5 rotations)
empty log files are rotated, old logs are removed
considering log /var/log/logrotate-test/access.log
  Now: 2020-11-13 21:00
  Last rotated at 2020-11-13 20:31
  log does not need rotating (log has been rotated at 2020-11-13 20:31, that is not day ago yet)

提示该日志文件今日已切割过,切割记录在 /var/lib/logrotate/logrotate.status

修改切割记录为两天前。

"/var/log/logrotate-test/access.log" 2020-11-11-20:31:46

再次执行命令,生成切割日志。

指令

指令说明
missingok如果日志文件不存在,不报错。
nocreate切割完日志文件后,不创建新文件。
notifempty如果日志文件为空,不切割。
postrotate/endscript执行完切割后执行的命令。
prerotate/endscript执行切割前执行的命令。
sharedscriptsprerotate 和 postrotate 只执行一次