滚动日志文件而不丢失任何日志事件

滚动日志文件而不丢失任何日志事件

我有一个名为 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

请注意,您将丢失数据通过这样做,所以只有当您确定您在其他地方有数据时才应该截断,但当您不太关心日志文件的内容并且您有一个不间断的写入过程时,这是一个有用的技巧。

相关内容