Logroate 配置及使用示例。
logrotate 配置文件路径
- 执行程序:
/usr/sbin/logrotate
- 默认配置文件:
/etc/logrotate.conf
- 其它配置文件:
/etc/logrotate.d/*
logrotate
默认读取 /etc/logrotate.conf
配置文件,通过 include /etc/logrotate.d
来加载其它配置文件。
logrotate 状态文件路径
/var/lib/logrotate.status
执行 logrotate
logrotate
本身不是 daemon 程序,它通过 cron
程序来定期执行。它的 cron
脚本通常放在 /etc/cron.daily/logrotate
,因此 logrotate
会按天执行。
对于使用 size
指令来转储的日志,如果日志内容增长很快,那么就不适合按天来执行 logrotate
,那样会导致日志文件的大小很快超过 size
设置的大小,而 logrotate
只在一天执行一次,所以不能及时转储。因此 size
指令不能保证你转储的日志文件大小与指令设置的大小一致,如果希望它们尽可能一致,你需要足够频繁的调用 logrotate
。
如果希望一天内多次执行 logrotate
来检查基于日志大小的转储,你可以:
-
将 logrotate 的 cron 脚本从 cron.daily 移动到 cron.hourly,使其每小时执行一次
mv /etc/cron.daily/logrotate /etc/cron.hourly/logrotate
-
或直接添加 cron job,使其在更小的时间间隔执行。
crontab -u root -e
# 每15分钟执行一次 nginx 的日志转储 */15 * * * * /usr/sbin/logrotate /etc/logrotate.d/nginx /dev/null 2>&1 &
logrotate 命令选项
查看版本
如果没有给出命令行参数,logrotate 将打印版本和版权信息,以及一个简短的使用摘要。
-d, –debug
与 --dry-run
一样,模拟一次执行,并输出执行信息,隐含了 --verbose
选项。
logrotate -d /etc/logrotate.d/nginx
-f, –force
强制执行一次转储,即使没有达到设定的阈值。
logrotate -f /etc/logrotate.d/nginx
-v, –verbose
执行并输出详细信息。
logrotate -v /etc/logrotate.conf
配置文件
示例1
# 为下面两个日志文件配置转储
/var/log/httpd/access.log
/var/log/httpd/error.log
{
rotate 5 # 保留 5 份转储文件
size 10M # 日志文件超过 10M 后进行转储
sharedscripts # 如果两个日志文件同时达到转储条件,转储后只执行一次下面的脚本
postrotate
/usr/bin/killall -HUP httpd
# 或
# /bin/kill -HUP $(/bin/cat /var/run/httpd.pid 2>/dev/null) &>/dev/null
endscript
}
当 logrotate
进行转储时,会重命名日志文件到转储文件,但进程还是持有原来打开的文件句柄,所以会继续向重命名后的转储文件写入日志信息,因此通过向进程发送 SIGHUP
信号通知其重载配置。
示例2
/var/log/nginx/*.log {
rotate 7 # 保留 7 份转储
daily # 按天转储
copytruncate # 复制日志文件到转储文件,并清空日志文件
compress # 压缩转储日志,默认使用 gzip 命令压缩
delaycompress # 将压缩推迟到下一次转储
missingok # 如果不存在要转储的日志文件,跳到下一个日志文件,不会报错
notifempty # 如果日志文件是空文件,不进行转储
dateext # 在文件名后面添加日期,默认格式 YYYYMMDD
dateformat -%Y-%m-%d # 将日期扩展的格式的设置为 -YYYY-MM-DD
extension .log # 将日志扩展名放到文件名末尾
createolddir 0755 nginx nginx # 如果不存在 olddir,则按照 chmod 格式创建
olddir /var/log/nginx/archives # 将转储后的日志文件放到指定目录
}
对于示例2,因为有些进程不接收系统信号,所以这里使用 copytruncate
指令,该指令不重命名日志文件,而复制日志文件内容到转储文件,然后清空日志文件内容。
注意:RedHat 6 上 logrotate 的默认版本是 3.7.8
,该版本不支持 createolddir
指令,可以查看系统上的 logrotate(8) 手册 (man logroate
) 来了解当前版本支持哪些指令。
假如有日志文件 /var/log/nginx/nginx.log
,当时间超过一天后,会生成转储文件:
/var/log/nginx/archives/nginx-2020-04-15.log
两天后,生成第二个转储文件,并压缩前一个转储文件:
/var/log/nginx/archives/nginx-2020-04-16.log
/var/log/nginx/archives/nginx-2020-04-15.log.gz
logrotate 指令 (Directives)
minsize maxsize 和 size 的区别
minsize 当文件大小超过 minsize
,并且超过指定时间间隔才会转储日志。例如:minsize 50M
,hourly
表示当文件大小超过 50MB 并且自上次转储后过去了一个小时,才会进行转储。
maxsize 当文件大小超过 maxsize
,或者超过指定时间间隔就会转储日志。例如: maxsize 50M
,hourly
表示当文件大小超过 50MB 或者自上次转储后过了一个小时,就会进行转储。
size 只要文件大小超过 size
就会进行转储,与时间无关。
size directive | logic | time directive | result |
---|---|---|---|
minsize 50M |
and | hourly |
rotate |
maxsize 50M |
or | hourly |
rotate |
size 50M |
- | - | rotate |