使用logrotate管理PHP生成的日志

使用logrotate管理PHP生成的日志

我的 PHP 脚本生成日志文件,我正在尝试使用 logrotate 来管理它们。

文件/etc/logrotate.d/php-logs

/srv/cache/*.log {
  daily
  notifempty
  size 800K
  rotate 5
  missingok
  compress
  delaycompress
}

这是可行的,除了有时日志轮换过程与 PHP 尝试附加日志的过程同时发生。

解决这个问题的最好方法是什么?

答案1

有一些日志轮换选项可能会有所帮助。请参阅 copytruncatehttp://www.linuxcommand.org/man_pages/logrotate8.html 这将创建一个副本并截断原始文件。因此,日志文件不必关闭,并且由您的 php 脚本保持打开状态。一些日志语句可能会在复制和截断操作之间丢失。

答案2

同时,我的解决方案(绷带)是在 PHP 中完成的,但我意识到它可能不是最合适或最优雅的。

<?php
function log_record($str, $file_name) {
    $n = 0;
    while ($n < 10) {
        if (is_readable($file_name)) {
            file_put_contents($file_name, str_pad($_SERVER["REMOTE_ADDR"], 15, ' ', STR_PAD_RIGHT).' ['.date("Y-m-d H:i:s").'] '. $str . PHP_EOL, FILE_APPEND | LOCK_EX);
            exit;
        }
        usleep(10000); // That's 10 ms, up to 10 times.
    }
}

相关内容