服务器跑久了,/var/log 下一堆 access.log、syslog、nginx.log,后面还跟着 .1、.2、.3……甚至 .10.gz,翻找昨天的 Nginx 错误日志时,得数三遍才能确认哪个是 2024-06-15 的压缩包——这事儿真不怪你,是 logrotate 默认命名太‘佛系’。
默认命名为啥让人头大
logrotate 默认用数字后缀轮转,比如:
app.log
app.log.1
app.log.2
app.log.3.gz
它不带日期,不带主机名,也不区分环境。一台机器上跑多个服务,或者要归档到统一日志平台时,光靠数字根本分不清哪份是测试机凌晨三点的报错,哪份是生产机下午的慢查询。
加日期?一行配置就能搞定
打开你的 logrotate 配置(比如 /etc/logrotate.d/nginx),找到对应日志块,在 rotate 或 daily 后面加上这两行:
dateext
dateformat -%Y%m%d
保存后 reload:sudo logrotate -f /etc/logrotate.conf。再轮转一次,你就看到:
access.log
access.log-20240615
access.log-20240614.gz
清爽多了吧?dateformat 支持所有 strftime 格式,想加时分就写 -%Y%m%d_%H%M,想带短横线分隔就用 -%Y-%m-%d,自己看着顺眼就行。
还想带上主机名或环境标签?加个 postrotate
默认 dateext 不支持插入变量,但你可以用 postrotate 手动重命名。比如让每份日志都带 web01-prod 标签:
/var/log/nginx/*.log {
daily
missingok
rotate 30
compress
delaycompress
dateext
dateformat -%Y%m%d
sharedscripts
postrotate
for f in /var/log/nginx/*.log-*; do
[ -f "$f" ] && mv "$f" "${f%.log-*}.log-$(hostname)-prod-$(date +\%Y%m%d)"
done
endscript
}
注意:实际使用时把 $(hostname) 和 $(date +\%Y%m%d) 换成你自己的标识,引号和转义别漏掉。这个小技巧在多节点集群里特别实用,查日志时一眼锁定来源。
避坑提醒
• dateext 和 extension 别混用,后者是强制加固定后缀(比如 .log),会跟 dateext 冲突;
• 如果日志路径含通配符(如 /var/log/app/*.log),确保每个匹配文件都符合命名逻辑,否则可能漏转;
• 修改完先用 logrotate -d /path/to/config 跑个调试模式,看输出里是否出现你想要的文件名,别等半夜轮转失败才报警。