logrotate
logrotate是Linux系统中一个非常重要的日志管理工具,它可以自动对日志文件进行轮转、压缩、删除等操作,有效地解决了日志文件不断增大占用磁盘空间的问题。
logrotate的工作原理
logrotate并不是一个常驻进程,而是通过cron计划任务定期执行。默认情况下,它每天会被执行一次,由/etc/cron.daily/logrotate脚本调用。logrotate会读取配置文件(通常是 /etc/logrotate.conf 和 /etc/logrotate.d/ 目录下的文件),根据配置规则来处理日志文件。
cat /etc/cron.daily/logrotate
#!/bin/sh
/usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
/usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0关于crond是否每天运行logrotate,可以查看日志/var/log/cron:
grep logrotate /var/log/cron配置文件
/etc/logrotate.conf主配置文件,定义了全局的日志轮转策略。/etc/logrotate.d/:存放各个应用程序的日志轮转配置文件。通常建议将应用程序的日志轮转配置单独放在这个目录下,方便管理。
配置文件语法
配置文件由一系列的指令组成,每个指令占一行。以下是一些常用的指令:
daily/weekly/monthly/yearly:指定日志轮转的频率,分别为每天、每周、每月、每年。rotate <count>:指定保留的日志文件数量。例如,rotate 7表示保留 7 个旧的日志文件。size <size>:指定日志文件的大小,当日志文件达到指定大小时进行轮转。例如,size 10M表示当日志文件达到 10MB 时进行轮转。compress:压缩轮转后的日志文件,默认使用 gzip 压缩。delaycompress:延迟压缩,即下一次轮转时才压缩上一次轮转的日志文件。missingok:如果日志文件不存在,则忽略错误信息。notifempty:如果日志文件为空,则不进行轮转。create <mode> <owner> <group>:轮转后创建新的日志文件,并指定权限、所有者和所属组。例如,create 0644 root root。dateext: 使用当前日期作为轮转后日志文件的文件名后缀copytruncate:复制当前的日志文件并清空原文件。这种方式适用于一些无法在文件被重命名后重新打开日志文件的应用程序。postrotate/endscript: 在日志轮转后执行的脚本。prerotate/endscript:在日志轮转前执行的脚本。
配置示例
以下是一个典型的日志轮转配置文件示例(/etc/logrotate.d/nginx):
/var/log/nginx/*.log {
weekly
rotate 52
compress
missingok
notifempty
dateext
create 0640 www www
postrotate
if [ -f /var/run/nginx.pid ]; then
/bin/kill -HUP $(cat /var/run/nginx.pid)
fi
endscript
}这个配置文件的意思是:
- 针对
/var/log/nginx/目录下所有的.log文件进行轮转。 - 每周轮转一次。
- 保留52个旧的日志文件。
- 如果日志文件不存在,则忽略错误信息。
- 如果日志文件为空,则不进行轮转。
- 使用当前日期作为轮转后日志文件的文件名后缀
- 轮转后创建新的日志文件,权限为0640,所有者和所属组为www。
- 轮转后执行一个脚本,该脚本会检查nginx的pid文件是否存在,如果存在则向nginx进程发送HUP信号,使nginx重新加载日志文件。
手动执行
可以使用以下命令手动执行logrotate:
logrotate /etc/logrotate.conf:执行主配置文件。logrotate /etc/logrotate.d/<config_file>:执行指定的配置文件。logrotate -vf /etc/logrotate.conf:以 verbose 模式执行,显示详细的执行过程。logrotate -d /etc/logrotate.conf:以debug模式执行,测试配置文件是否有错误,并不会真正执行轮转操作。logrotate -f /etc/logrotate.conf:强制执行轮转操作,即使日志文件没有达到轮转条件。
注意
- logrotate依赖cron计划任务,请确保cron服务正常运行。
- 在修改配置文件后,最好使用
-d参数进行测试,以避免出现意外错误。 - 对于一些需要重新加载日志文件的应用程序(例如 nginx),需要在
postrotate脚本中添加相应的命令。