服务公告

服务公告 > 技术教程 > logrotate 高级用法:日期后缀与压缩保留

logrotate 高级用法:日期后缀与压缩保留

发布时间:2025-11-11 12:27
## 场景 应用日志每天产生数 GB,默认按序号轮转的文件在排查时很难对应到具体日期,.log.1 与 .log.2 谁是前天的全靠猜;压缩不及时又把磁盘占满,告警响起时才发现保留了几十份未压缩的旧日志。logrotate 的日期后缀与压缩保留参数,正好解决这两个痛点,是日志治理里投入最小、收益最直接的一处配置,改一个文件就能让目录秩序长期维持。 ## 步骤清单 编辑 /etc/logrotate.d/myapp,写入如下配置。 ``` /var/log/myapp/*.log { daily dateext dateformat -%Y%m%d rotate 30 compress delaycompress missingok notifempty copytruncate } ``` dateext 让轮转文件以日期结尾,配合 dateformat 指定到年月日,排查时按日期直接定位文件;rotate 30 保留三十份历史,按业务留存要求调整;compress 压缩旧文件,文本日志的压缩比通常很可观,delaycompress 把压缩推迟一天,保证最新一份仍是明文,当天排查不需要先解压。missingok 与 notifempty 处理文件缺失和空文件的边界情况,避免误报错。日志增长不均匀的业务,还可以加一条 maxsize 200M,配合 daily 形成超过上限提前轮转的双保险,突发流量冲高时也不会把单文件撑到难以打开。 ## 验证 写完先干跑一次,检查将要执行的动作而不真正改动文件。 ``` logrotate -d /etc/logrotate.d/myapp ``` 输出里会列出将要轮转哪些文件、压缩哪些、删除哪些,逐行核对与预期一致后,把 -d 换成 -f 强制立即轮转一次,验证真实效果。确认目录里出现带日期的文件、隔天的旧文件被压缩、超过保留份数的文件被清理,配置即算生效。cron.daily 会自动按天调用 logrotate,不需要再额外注册定时任务。 ## 注意事项 copytruncate 先复制再清空原文件,适合不响应文件重命名信号的程序,代价是复制瞬间可能有少量日志丢失;服务本身支持重开句柄时,优先用默认的 create 方式配合 postrotate 里的重载动作,例如 nginx 场景在片段里加一段重载命令。dateformat 只支持年月日等有限占位符,不要指望写时分秒。顺云云服务器磁盘水位告警紧张时,先复查 logrotate 的保留份数与压缩时机,往往比直接扩容更快见效。