logrotate VPS 日志轮转教程:压缩、权限、验证与回滚
在 Linux VPS 上配置 logrotate,覆盖轮转周期、大小阈值、压缩、create 与 copytruncate、postrotate、安全权限和调试验证。

logrotate VPS 日志轮转教程:压缩、权限、验证与回滚
这篇 logrotate VPS 日志轮转教程用于防止应用文本日志无限增长。logrotate 可以按时间或大小轮转、压缩和删除旧文件,但错误的通配符、权限或 postrotate 脚本也可能损坏日志和服务。上线前必须用 debug 模式验证。
开始前可参考systemd 服务自动重启教程和Docker Compose 数据备份,确认服务如何重新打开日志以及配置如何回滚。
识别日志写入方式
先确认应用写入普通文件、syslog 还是 systemd journal。journald 自己管理二进制日志文件,不应直接用普通通配规则处理。对文本日志,要确认进程能否在收到 HUP 后重新打开文件。
检查 /etc/logrotate.conf、/etc/logrotate.d/ 和 systemd 的 logrotate.timer。默认调度常为每日一次,因此即使规则写 hourly,没有更频繁的 timer 也不会真的每小时运行。
创建最小规则
为单个应用创建独立文件,使用准确路径,避免 * 同时匹配已经轮转的文件。选择 daily、weekly 或 size,并配置 rotate 数量、compress、delaycompress 与 missingok。
create 会在轮转后建立新文件,应明确 mode、user 和 group。目录由非特权用户控制时,root 运行的 logrotate 应使用 su 指令,降低不安全目录带来的权限问题。
create 与 copytruncate
能够重新打开日志的服务应优先使用 rename 加 create,再在 postrotate 中安全发送 reload 或 HUP。这样轮转边界清晰。sharedscripts 可让多个匹配文件只执行一次脚本。
copytruncate 适用于无法重新打开文件的旧应用,但复制和截断之间存在小窗口,少量日志可能丢失。不能为了省去服务重载就默认使用它。
调试与强制轮转
先执行 logrotate --debug 配置文件。debug 不会修改日志和状态文件,可查看匹配、条件和计划动作。确认无误后用 --verbose 观察真实运行。
--force 会忽略正常时间条件,应只在受控测试中使用。测试前保留当前日志副本,并检查磁盘空间,防止压缩或复制大文件耗尽空间。
postrotate 安全边界
postrotate 以高权限执行时,不要拼接来自文件名或环境的未验证输入。使用明确的 systemctl kill -s HUP 服务名 或受支持 reload 命令,并确保脚本失败能产生非零状态和告警。
轮转后检查服务仍运行、新文件属主与权限正确、应用继续写入、压缩文件可读取。不要只看旧文件出现就认为成功。
状态文件与并发
logrotate 使用状态文件记录上次轮转时间,并对其加锁。不要让多个定时任务使用同一状态文件同时运行;如果需要隔离测试,指定单独的 state file。
查看 systemd timer 和服务日志,确认计划任务实际触发。任何错误都会让 logrotate 以非零状态退出,但状态文件仍可能更新,因此告警必须读取退出码和日志。
保留与容量规划
根据故障调查、合规和磁盘预算设置保留数量。压缩可以节省空间,但最新轮转文件若仍被进程占用,delaycompress 往往更安全。将需要长期保存的日志发送到独立存储,不要无限增加本机 rotate。
回滚与最终验证
回滚时恢复原配置,手动让应用重新打开正确日志,并确认没有进程继续写入已改名文件。用 lsof、文件大小变化和服务日志检查写入目标。
可靠的 logrotate 配置应包含准确路径、明确权限、安全重载、debug 验证、退出码告警和容量预算。它管理的是文件生命周期,不能替代集中日志与备份。


