logrotate配置文件缩进错误直接导致解析失败,因其只接受空格对齐且要求逻辑块严格左对齐,tab或错位缩进会引发语法错误,调试时需用cat -a查隐藏字符并借助编辑器显示空白字符辅助定位。

logrotate配置文件缩进错误直接导致解析失败
logrotate不认Tab,也不接受任意空格数——它只按“逻辑块”对齐,且必须用空格。一旦缩进错位,logrotate -d 会报类似 error: /etc/logrotate.d/myapp:12 line unexpected 或更模糊的 syntax error,根本不会告诉你哪行缩进错了。
配置项缩进必须严格对齐,不能靠“看着差不多”
logrotate配置是纯文本驱动,没有YAML那种层级嵌套,但每个指令块内部要求视觉对齐。比如:
"/var/log/myapp/*.log" {
daily
rotate 30
compress
missingok
postrotate
systemctl reload myapp.service > /dev/null 2>&1 || true
endscript
}
注意:daily、rotate、compress 必须和 missingok 对齐;postrotate 和 endscript 也必须对齐;而它们内部的命令(如 systemctl reload)必须比 postrotate 多缩进至少一个空格(通常用4个)。如果 postrotate 和 rotate 左侧位置相同,logrotate 就认为它是新日志路径块的开始,直接报错。
- 所有缩进只允许用空格,绝对不要用 Tab(编辑器设为 “insert spaces”)
- 同一作用域下的指令(如
daily、rotate、compress)必须严格左对齐 -
prerotate/postrotate块内命令必须缩进,且不能和块头同列 - 大括号
{和}必须独占一行,且与日志路径在同一列
logrotate -d 不报缩进细节,得靠肉眼+排除法定位
logrotate -d 只会提示“某行附近出错”,不会说“第7行缩进多了一个空格”。实际排错时,建议:
使用ydata-profiling(前身为pandas-profiling)生成全面的数据质量报告,包含相关性分析、缺失值模式和基数检测。导出交互式HTML仪表板和JSON摘要。
- 用
cat -A /etc/logrotate.d/myapp查看隐藏字符:Tab 显示为^I,结尾空格显示为$ - 把整段配置复制到支持语法高亮的编辑器(如 VS Code),打开“显示空白字符”,一眼看出混入的 Tab 或末尾空格
- 临时删掉
postrotate块,再跑logrotate -d;如果通过,说明问题就在那个块的缩进或endscript位置 - 确认
endscript是独立一行,且前面不能有空格——它不是缩进内容,而是终止标记
子配置文件里别写全局指令,避免缩进混淆
/etc/logrotate.d/ 下的文件不支持 weekly、rotate 这类全局默认设置——它们只在 /etc/logrotate.conf 顶层生效。如果你在 /etc/logrotate.d/nginx 里写了:
weekly
"/var/log/nginx/*.log" { ... }
logrotate 会把 weekly 当作一个未加引号的日志路径,然后报错: error: bad top-level definition。正确做法是所有规则都包裹在路径块里,全局设置只留在主配置中。
真正容易被忽略的是:logrotate 的“缩进”本质是语法分隔符,不是格式美化。它不像 Python 那样靠缩进定义作用域,而是靠“对齐+换行+大括号”共同构成语义边界。少一个空格可能就跨进了另一个逻辑分支。










