logrotate 默认将 /var/log/messages 轮转为 messages.1、messages.2 等数字后缀文件;启用 dateext 后改为 messages-yyyymmdd 格式,且状态文件 /var/lib/logrotate.status 不一致会导致跳号。

logrotate 默认切割后 messages 的文件名规则
默认情况下,logrotate 对 /var/log/messages 执行轮转后,生成的归档文件名是带数字后缀的顺序命名,不带日期 —— 即 messages.1、messages.2、messages.3…… 依次类推。
这个命名逻辑依赖于配置中是否启用 dateext:
- 未启用
dateext(默认状态):只用数字后缀,如messages.1 - 启用
dateext:后缀变为日期格式,如messages-20260907(取决于dateformat设置) - 若同时启用
dateext和extension .log,则变成messages-20260907.log
注意:dateext 不会自动覆盖已有同名文件;如果当天已存在 messages-20260907,logrotate 会跳过本次重命名,或追加数字(如 -20260907.1),具体行为取决于是否配置了 dateyesterday 或 nodateext 干扰项。
为什么 messages.1 有时不出现,或直接跳到 messages.2
这通常不是 bug,而是 logrotate 状态文件记录与实际文件状态不一致导致的。关键看 /var/lib/logrotate.status 里对 /var/log/messages 的最后轮转时间戳:
- 如果该时间戳比当前系统时间早一天,但
messages.1已被手动删除,logrotate下次运行时仍会尝试把messages→messages.1,再把旧messages.1→messages.2—— 但因原messages.1不存在,就只剩messages.1 - 如果配置了
rotate 3且已存在messages.1~messages.3,下次轮转会删掉messages.3,其余上移,结果就是messages→messages.1→messages.2→messages.3(新) - 用
logrotate -d -f /etc/logrotate.conf可观察实际将执行的重命名步骤,比猜更可靠
split 切割出来的 messages 文件名完全不同
如果你没用 logrotate,而是用 split 手动切分 /var/log/messages,那文件名完全由你指定,和系统日志轮转无关:
-
split -d -b 10M /var/log/messages /var/logbak/messages-→ 生成messages-00、messages-01、messages-02… -
split -l 10000 /var/log/messages→ 默认输出xaa、xab、xac…(除非用-d改成数字) - 脚本里常见写法如
split -d -b 74752 /var/log/messages /var/logbak/messages-$(date -d "-1 day" +%F)-→ 得到messages-2026-09-07-00这类名
这类名字不会被 logrotate 识别或管理,纯属人工归档,后续清理、压缩、过期都得自己在脚本里补全。
容易被忽略的关键点
真正影响归档文件名的,不是命令本身,而是配置加载顺序和状态文件一致性:
-
/etc/logrotate.conf定义全局默认值(如rotate 4、weekly),但/etc/logrotate.d/下的同名配置会覆盖它 -
/var/lib/logrotate.status是二进制状态记录,不能手工编辑;误删会导致重复轮转或跳号 - 修改配置后必须用
logrotate -d -f验证,否则可能看似生效,实则因语法错误被静默跳过 - rsyslog 本身不负责切割 —— 它只管写;切割动作 100% 由
logrotate或你写的split脚本触发











