日志越积越多怎么办:先理解 Logrotate 如何轮转

阿远
2026-10-27 / 0 评论 / 0 阅读 / 正在检测是否收录...
归档日期:2026-10-27;补录发布:2026-10-28。

日志帮助排错,也会持续占磁盘。直接删除正在写的日志不一定释放空间,因为程序可能仍持有文件描述符,排查证据却先丢了。

轮转做什么

Logrotate 按策略改名和保留历史日志,再让应用写入新文件。规则通常在 /etc/logrotate.d/,全局入口常见为 /etc/logrotate.conf。先查看已有规则,避免同一文件重复配置。

下面只是结构示例,不是本站新增配置:

/var/log/example-app/*.log {
    daily
    rotate 14
    compress
    delaycompress
    missingok
    notifempty
    create 0640 example example
}

daily 表示按日判断轮转条件,rotate 14 表示保留指定数量的副本。compress 压缩旧日志;delaycompress 将最近一份历史文件的压缩推迟。missingok 容许日志不存在,notifempty 避免空文件也轮转。

create 的用户组必须与应用匹配,example 是占位账号,不能原样用于生产。

改名以后应用知道吗

一些应用继续写旧文件,因此还需要 postrotate 通知重新打开日志。Nginx 有相应信号机制,其他程序可能不同,不能给所有程序统一发同一种信号。

copytruncate 先复制再截断,适合某些不能重新打开日志的程序,但复制与截断之间存在丢日志窗口,不是零风险替代方案。

先只读调试

logrotate -d /etc/logrotate.conf
journalctl --disk-usage

-d 只显示调试信息,不实际轮转或更新状态。-f 会强制轮转并改变文件,不能当作无影响测试。

验收不只看压缩包

先估算每天增长量,再决定保留周期。访问、错误、审计日志可能需要不同策略。已丢弃的访问记录无法凭空还原成访客报表。

验收应同时确认应用写入新日志、历史文件可读、权限正确、磁盘增长受控,不能只看到一个 .gz 就结束。

补全重新打开日志的验证

对于由 systemd 管理、支持相应操作的 Nginx,可以在核对原有包规则后使用 USR1 通知重新打开日志;不是所有服务都接受这个信号。轮转后发一条测试请求,检查新 access.log 修改时间和内容,并确认历史文件停止增长。daily 是调度检查条件,不保证调度器停止期间仍每天自动轮转;先核对 logrotate timer 或 cron。

内容复核与修订:2026-10-29。实验示例与本站运行记录分别说明;原始归档日期保留。
0

评论 (0)

取消