logrotate 使用指南
logrotate
是一个强大的 Linux 日志管理工具,用于自动轮转、压缩、删除和归档日志文件,防止日志占用过多磁盘空间。本文详细讲解 logrotate
的工作原理、配置方法、常用选项,并提供多个实际使用示例。
一、logrotate 工作原理
logrotate
通常由系统的 cron
定时任务(默认位于 /etc/cron.daily/logrotate
)每天运行,根据配置文件检查日志文件是否需要轮转。轮转的触发条件包括文件大小、时间周期等。
轮转过程包括:
- 重命名当前日志文件(如
app.log
改为app.log.1
)。 - 创建新的空日志文件。
- 压缩旧日志文件(如
app.log.1
压缩为app.log.1.gz
)。 - 删除过旧的日志文件。
- 执行自定义脚本(如通知服务重新打开日志文件)。
二、配置文件结构
主配置文件位于 /etc/logrotate.conf
,包含全局设置。特定应用的轮转规则通常放在 /etc/logrotate.d/
目录下的独立文件中。
1. 配置文件语法
配置文件由多个块组成,每个块定义一组日志文件的轮转规则,格式如下:
/path/to/logfile {
选项1
选项2
...
}
2. 常用选项
以下是常用配置选项:
-
轮转触发条件:
size <大小>
:文件达到指定大小时轮转(如size 100M
)。daily
:每天轮转。weekly
:每周轮转。monthly
:每月轮转。
-
轮转后处理:
rotate <次数>
:保留的轮转文件数量(如rotate 7
)。compress
:压缩旧日志文件(通常使用 gzip)。delaycompress
:推迟压缩到下次轮转。missingok
:日志文件不存在时不报错。notifempty
:空日志不轮转。create <权限> <用户> <组>
:创建新日志文件并指定权限等(如create 0644 root root
)。copytruncate
:复制后截断原文件,适合无法重启的服务。
-
脚本执行:
prerotate
:轮转前执行的脚本。postrotate
:轮转后执行的脚本。
-
其他:
olddir <目录>
:将轮转日志移动到指定目录。maxage <天数>
:删除超过指定天数的日志。dateext
:轮转文件名添加日期后缀(如app.log-20250423
)。
3. 全局配置
在 /etc/logrotate.conf
中设置全局选项,适用于所有日志文件,除非被 /etc/logrotate.d/
中的配置覆盖。例如:
weekly
rotate 4
create
compress
include /etc/logrotate.d
三、运行方式
-
手动运行:
- 运行:
logrotate /etc/logrotate.conf
- 强制执行:
logrotate -f /etc/logrotate.conf
- 调试:
logrotate -d /etc/logrotate.conf
(仅模拟,不实际执行)
- 运行:
-
定时运行:
默认通过/etc/cron.daily/logrotate
每天运行,可修改 cron 调整频率。 -
状态文件:
状态文件(/var/lib/logrotate/status
)记录每个日志的最后轮转时间。
四、实际使用示例
以下是针对不同场景的 logrotate
配置示例。
示例 1:Nginx 日志(每天轮转)
为 Nginx 日志配置每天轮转,保留 7 天,压缩旧日志并重启 Nginx。
配置文件:/etc/logrotate.d/nginx
/var/log/nginx/*.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
create 0644 nginx nginx
postrotate
/usr/sbin/nginx -s reopen
endscript
}
说明:
- 每天轮转,保留 7 个旧日志。
- 压缩旧日志,推迟到下次轮转。
- 轮转后通知 Nginx 重新打开日志文件。
结果:
access.log
轮转为access.log.1
,下次为access.log.2.gz
。- 保留 7 个旧日志。
示例 2:应用程序日志(基于大小)
为应用日志配置基于大小的轮转,超过 100MB 触发,保留 5 个日志,添加日期后缀。
配置文件:/etc/logrotate.d/myapp
/var/log/myapp/app.log {
size 100M
rotate 5
dateext
compress
missingok
copytruncate
}
说明:
- 文件超 100MB 轮转,保留 5 个日志。
- 使用日期后缀(如
app.log-20250423
)。 - 复制并截断原文件,适合无法重启的应用。
结果:
app.log
超 100MB 轮转为app.log-20250423
,原文件截断。- 旧日志压缩为
.gz
,保留 5 个。
示例 3:系统日志(存档到目录)
为 /var/log/syslog
配置每月轮转,保留 12 个月,存档到指定目录。
配置文件:/etc/logrotate.d/syslog
/var/log/syslog {
monthly
rotate 12
compress
olddir /var/log/archive
maxage 365
missingok
notifempty
create 0640 root adm
}
说明:
- 每月轮转,保留 12 个日志。
- 旧日志存到
/var/log/archive
,超过 365 天删除。 - 新日志文件权限为 0640,属主 root,属组 adm。
结果:
syslog
轮转为/var/log/archive/syslog.1.gz
。- 保留 12 个月,超期删除。
示例 4:数据库日志(复杂脚本)
为数据库日志配置每周轮转,保留 4 周,轮转前备份到远程服务器。
配置文件:/etc/logrotate.d/database
/var/log/db/*.log {
weekly
rotate 4
compress
missingok
prerotate
/bin/cp /var/log/db/*.log /tmp/db_backup/
/usr/bin/scp /tmp/db_backup/*.log user@remote:/backup/
endscript
postrotate
/bin/rm -f /tmp/db_backup/*.log
endscript
}
说明:
- 每周轮转,保留 4 个日志。
- 轮转前备份日志到远程服务器,轮转后清理临时文件。
结果:
- 日志每周轮转,旧日志压缩。
- 备份到远程服务器,临时文件清理。
五、注意事项
-
权限:
- 确保
logrotate
(通常以 root 运行)有权限操作日志文件和脚本。 - 检查
create
和olddir
的权限。
- 确保
-
测试:
- 使用
logrotate -d
调试配置。 - 使用
logrotate -f
测试实际效果。
- 使用
-
服务重启:
- 使用
postrotate
确保服务正确切换日志。 - 无法重启的服务使用
copytruncate
。
- 使用
-
磁盘空间:
- 定期检查日志占用,确保
compress
和maxage
有效。 - 确认
olddir
目录空间充足。
- 定期检查日志占用,确保
-
状态文件:
- 检查
/var/lib/logrotate/status
是否正确更新。
- 检查
六、总结
logrotate
是管理日志的理想工具,灵活的配置选项支持各种场景。关键是根据日志特性选择触发条件、控制存储空间,并利用脚本处理复杂需求。