logrotate配置中的copytruncate如何使用?
copytruncate是logrotate配置文件中的一个指令用于在轮转日志时采用“先复制再清空”的策略而不是默认的“先重命名再新建”策略。工作原理默认情况下没有copytruncatelogrotate会将当前日志文件access.log重命名为access.log.1创建一个新的空文件access.log向应用程序发送信号如kill -USR1让其重新打开新的日志文件而使用copytruncate时复制将access.log的内容完整复制到access.log.1清空将access.log文件的大小截断truncate为 0保留原文件的 inode、权限和所有者整个过程中日志文件的文件名和 inode 编号都不变。为什么要用copytruncate有些应用程序无法被通知重新打开日志文件或者不支持通过信号等方式优雅地切换日志文件。例如老旧的自研程序日志句柄一直被持有某些数据库如旧版 MySQL如果直接重命名日志文件它仍会继续写入旧文件文件名变了但 inode 没变文件描述符还在在容器环境中进程无法接收外部信号copytruncate可以让程序始终写入同一个文件inode 不变无需任何配合即可实现轮转。优缺点优点缺点无需停止服务无需发送信号可能丢失日志在复制和截断之间的极短时间内写入的日志行可能会丢失对程序透明无需修改配置I/O 双倍消耗复制整个日志文件通常很大会占用磁盘读写保留原文件 inode某些监控系统更稳定如果日志文件非常大复制操作可能导致磁盘 I/O 飙升配置示例/var/log/nginx/access.log { daily rotate 7 copytruncate # 使用复制清空而不是重命名 compress missingok }与默认方式createpostrotate的对比特性默认方式重命名新建copytruncate方式是否需要程序配合需要发送信号程序重新打开文件不需要是否可能丢日志极少信号发送到程序重新打开之间的瞬间可能复制与截断之间写入的数据磁盘 I/O低仅重命名无数据复制高每次轮转都要完整复制日志文件文件 inode改变新文件 inode 不同不变推荐场景绝大多数现代应用Nginx、Apache、rsyslog无法发送信号的遗留程序在 Nginx 中的建议不要对 Nginx 日志使用copytruncate。Nginx 完美支持USR1信号来重新打开日志文件使用默认方式postrotate中kill -USR1更安全、高效且不会丢日志。如果错误地对 Nginx 使用了copytruncate当访问量很大时access.log可能在复制过程中被持续写入导致复制操作永远跟不上写入速度磁盘 I/O 飙升日志文件实际上无法被清空因为写入速度超过复制速度使用copytruncate的正确场景一个老旧的二进制程序无法停止或重启且不支持重新打开日志文件日志文件不大几十 MB 以内对偶尔丢失几行日志不敏感如非关键业务日志注意事项copytruncate和create指令是互斥的不要同时使用如果日志文件非常大几 GB考虑使用默认方式或改用日志切割工具如cronolog、newsyslog截断truncate操作并不是原子的极少数情况下可能损坏文件因此建议保留create方式作为首选总结copytruncate是一种“向下兼容”的轮转方式适合无法配合的应用对于 Nginx 等主流服务永远优先使用默认的重命名信号方式。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2507583.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!