启用 copytruncate 指令可实现 logrotate 的“复制并截断”功能,适用于不支持日志重载、持有文件句柄或运行在容器中的应用;需显式配置,注意日志丢失风险与 I/O 开销。

要让 logrotate 在轮转时“复制并截断”原日志文件,关键就是启用 copytruncate 指令。它适用于那些无法重新打开日志文件、不能接收信号(如 USR1)或运行在容器中难以控制的应用程序。
这个操作不是默认行为,必须显式配置,且需注意适用场景和潜在风险。
确认是否需要 copytruncate
只有当你的应用程序:
- 不支持日志重载(比如不响应
kill -USR1) - 一直持有日志文件句柄(如某些老旧 daemon 或 Java 应用未做日志框架刷新)
- 运行在容器里,进程无法被宿主机发信号
才建议使用copytruncate。否则优先用标准方式(重命名 + 通知重开),更安全可靠。
在配置中启用 copytruncate
编辑对应服务的配置文件,例如 /etc/logrotate.d/myapp:
/var/log/myapp/app.log {
daily
rotate 7
compress
missingok
notifempty
create 0640 myapp myapp
copytruncate
}其中:
-
copytruncate必须写在花括号{}内,与其他指令平级 - 它会先完整复制内容到备份文件(如
app.log.1),再把原app.log截断为 0 字节 - 原文件的 inode、权限、所有者全部保留,应用无需感知变化
注意事项和常见问题
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
- 日志可能丢失:复制与截断之间存在极短时间窗口,新写入的日志行可能被覆盖。生产环境高吞吐场景需评估风险
- I/O 开销大:复制整个日志文件(尤其 GB 级)会触发大量磁盘读写,避免在业务高峰期轮转
- 不要和
create冲突:copytruncate本身不创建新文件,所以create指令仍可保留(用于确保权限正确),但实际不会新建文件 - 不能替代信号通知:如果你的应用支持
postrotate发送信号,应优先用kill -USR1方式,copytruncate是兜底方案
验证配置是否生效
先调试语法:
sudo logrotate -d /etc/logrotate.d/myapp
再强制执行一次轮转观察效果:
sudo logrotate -f /etc/logrotate.d/myapp
检查 /var/log/myapp/ 下:
-
app.log大小是否归零(但 inode 不变) -
app.log.1是否存在且内容完整
这样就完成了复制截断式轮转配置。

















