Logrotate无Extension参数,仅有extension指令用于声明日志文件固有后缀(如.log),不支持自定义添加后缀;真正实现加后缀需用postrotate/mv重命名或prerotate+copytruncate生成带后缀副本。

Logrotate 本身 没有名为 Extension 的内置参数。你可能混淆了 extension(注意小写)这个指令,它是 Logrotate 的一个有效配置项,但它的作用和常见理解的“为轮转日志添加自定义后缀”并不完全一致,且有严格限制。
下面直接说明如何正确使用 extension,并给出真正满足“为轮转日志添加自定义后缀”需求的实用方案:
✅ 正确理解 extension 指令的作用
extension 用于告诉 logrotate:当前日志文件名带有一个固定后缀(如 .log),轮转时应保留该后缀,并在数字序号前插入时间戳或序号。
它不支持任意自定义字符串后缀(比如 .backup、.archived),只支持一个静态扩展名,且仅影响轮转后的文件命名逻辑。
/var/log/myapp/app.log {
daily
missingok
rotate 7
compress
extension .log
}效果示例(假设启用 dateext):
- 原始日志:
app.log - 轮转后:
app.log-20241215(不是app-20241215.log)
⚠️ 注意:extension .log会让 logrotate 认为app.log的“主名”是app,后缀是.log,所以日期/序号插在中间。
? 关键点:
extension必须与日志文件实际后缀一致,否则轮转会失败或行为异常;它不能用来添加额外后缀,只是声明已有后缀。
✅ 真正实现“添加自定义后缀”的方法:用 postrotate + mv
Logrotate 不提供原生“加后缀”功能,但可通过 postrotate 脚本重命名刚轮转出的日志文件。
例如:希望将 app.log 轮转为 app.log.20241215.bak
/var/log/myapp/app.log {
daily
missingok
rotate 7
dateext
dateformat -%Y%m%d
compress
delaycompress
sharedscripts
postrotate
# 找到最新生成的带日期的归档文件(未压缩)
ARCHIVE=$(ls -t /var/log/myapp/app.log-*.log 2>/dev/null | head -n1)
if [ -n "$ARCHIVE" ] && [ -f "$ARCHIVE" ]; then
NEWNAME="${ARCHIVE%.log}.bak"
mv "$ARCHIVE" "$NEWNAME"
fi
# 如果已启用 compress,还要处理 .gz 文件(可选)
ARCHIVE_GZ=$(ls -t /var/log/myapp/app.log-*.log.gz 2>/dev/null | head -n1)
if [ -n "$ARCHIVE_GZ" ] && [ -f "$ARCHIVE_GZ" ]; then
NEWNAME_GZ="${ARCHIVE_GZ%.log.gz}.bak.gz"
mv "$ARCHIVE_GZ" "$NEWNAME_GZ"
fi
endscript
}? 提示:
-
dateext+dateformat确保生成形如app.log-20241215的文件(注意:此时无.log后缀,除非你用了extension .log) - 上例假设你没设
extension,让 logrotate 生成app.log-20241215,然后重命名为app.log-20241215.bak - 若你必须保留
.log在末尾(如app.log-20241215.log),请配合extension .log使用,并调整postrotate中的匹配逻辑(如用app.log-20241215.log)
✅ 更健壮的做法:用 prerotate 配合 copytruncate(适用于不可停服场景)
如果应用无法重启、且你希望“轮转时立刻打上标记”,可先复制再截断,并手动加后缀:
/var/log/myapp/app.log {
daily
copytruncate
missingok
rotate 7
prerotate
DATE=$(date +\%Y\%m\%d_\%H\%M)
cp /var/log/myapp/app.log "/var/log/myapp/app.log.${DATE}.backup"
endscript
}这样每次轮转前,都会生成一个带时间戳和 .backup 后缀的副本。
不需要 extension 也能达成目标,关键是根据场景选择:
- 用
postrotate重命名归档文件 → 适合标准轮转流程增强 - 用
prerotate+copytruncate→ 适合需留痕、不可中断服务的场景
Logrotate 的灵活性在于脚本钩子,而不是靠虚构参数。


















