我有一个名为 8GB 的文件,php.log
其中有一个正在运行的 php 脚本正在登录。记录每个事件对我来说很重要,我想压缩它并清空当前文件而不停止 Web 服务器。
如果我运行:
mv php.log php.log.backup20140305-01
touch php.log
我会丢失一些数据。如何才能做到这一点而不丢失任何数据?
答案1
您会发现配置起来更容易,logrotate
可以为您完成轮换。如果您创建一个名为的文件,/etc/logrotate.d/php
其中包含以下内容,它将自动处理日志轮换。这只是一个指南,因此请确保在投入生产之前对其进行测试和自定义。
/path/to/php.log {
daily
missingok # don't rotate if the file isn't there...
notifempty # ...or if it's zero-length
rotate 30 # keep 30 days' worth of logs
compress # gzip the logs, but...
delaycompress # ...only after they're over a day old
create 640 root adm # permissions with which to create new files
sharedscripts
postrotate
/etc/init.d/apache2 graceful # or whatever makes your process let go of the log file
endscript
}
注意:此摘录中的注释破坏了logrotate
语法,因此请确保将其从实时配置文件中删除。
答案2
你应该正如 Flup 所说使用 logrotate,但在不破坏当前文件句柄的情况下展平/截断日志文件的快速方法是:
> /path/to/php.log
请注意,您将丢失数据通过这样做,所以只有当您确定您在其他地方有数据时才应该截断,但当您不太关心日志文件的内容并且您有一个不间断的写入过程时,这是一个有用的技巧。