数码知识屋
霓虹主题四 · 更硬核的阅读氛围

日志轮转命名格式怎么改?Linux下logrotate自定义文件名实操

发布时间:2026-01-24 02:31:44 阅读:174 次

服务器跑久了,/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),找到对应日志块,在 rotatedaily 后面加上这两行:

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) 换成你自己的标识,引号和转义别漏掉。这个小技巧在多节点集群里特别实用,查日志时一眼锁定来源。

避坑提醒

dateextextension 别混用,后者是强制加固定后缀(比如 .log),会跟 dateext 冲突;
• 如果日志路径含通配符(如 /var/log/app/*.log),确保每个匹配文件都符合命名逻辑,否则可能漏转;
• 修改完先用 logrotate -d /path/to/config 跑个调试模式,看输出里是否出现你想要的文件名,别等半夜轮转失败才报警。