一、问题现象
服务器系统日志 /var/log/messages、secure、cron 持续膨胀,单日志文件体积达到 8G 以上。
已在 /etc/logrotate.d/syslog 配置每日自动切割规则,但长期未生成带日期后缀的归档日志,日志只会不断追加写入同一个文件,磁盘持续告警。
执行日志轮转命令 logrotate -v /etc/logrotate.d/syslog,直接抛出报错并跳过整套切割规则,自动轮转完全失效。
报错信息
bash
error: /etc/logrotate.d/syslog:1 lines must begin with a keyword or a filename (possibly in double quotes)
error: /etc/logrotate.d/syslog:9 lines must begin with a keyword or a filename
error: found error in /var/log/cron
skipping
报错含义:syslog 配置文件第 1 行、第 9 行存在无法识别的非法字符,logrotate 解析配置失败,直接放弃执行该文件内所有日志切割逻辑。
二、核心前置知识
- 两套配置优先级
/etc/logrotate.conf:全局默认规则(兜底配置)
/etc/logrotate.d/*:独立分片配置,同日志参数会覆盖全局配置 - 关键参数区分
logrotate -d:干跑模拟,仅校验语法,不改动任何日志(排查专用)
logrotate -v:真实执行轮转,满足周期就归档日志,并非仅检查
logrotate -vf:强制轮转,无视切割周期,立即执行归档
三、故障根因
配置文件复制粘贴带入不可见污染字符:
- Windows 记事本、Word 文档复制内容到 Linux,携带 Windows 特有 CRLF 换行符 ^M;
- 复制过程混入全角空格、制表符、隐藏乱码;
logrotate 语法校验严格,配置行开头不允许存在任何非法前置字符,一旦检测到污染,直接判定配置无效。
四、定位污染字符
执行命令查看文件隐藏特殊符号:
bash
cat -A /etc/logrotate.d/syslog
输出内容中出现 ^M、乱码、全角空格,即可确认文件被污染。