我的 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.
}
}