在PHP中滚动日志文件

时间:2011-09-28 22:14:01

标签: php

我想用PHP编写/读取滚动日志文件,其中只存储/读取最新的~300行,并丢弃任何旧行。我不确定最有效的方法 - 它需要快速工作,因为它在高流量网站上录​​制页面点击。

另一个PHP脚本将定期读取日志文件并使用数据进行计算。有很多PHP文件函数我很困惑从哪里开始!

我认为我的托管环境无法访问tailawk等命令,因此首选纯PHP解决方案。任何帮助表示赞赏!

5 个答案:

答案 0 :(得分:0)

你可以使用fopen: http://us3.php.net/manual/en/function.fopen.php

$mode = 'a+'; // opens the file with read/write access and sets the pointer to the end of the file
$handle = fopen ($filename, $mode);

接下来,你将文件泵入一个数组,然后抛开除最后300行之外的所有内容。

如果你真的对将文件保持在一定的大小感兴趣(你说〜300行),那么你可以使用fseek http://us3.php.net/manual/en/function.fseek.php(来自手册):

<?php

$fp = fopen('somefile.txt', 'r');

// read some data
$data = fgets($fp, 4096);

// move back to the beginning of the file
// same as rewind($fp);
fseek($fp, 0);

?>

答案 1 :(得分:0)

对于性能比较,您必须进行一些基准测试,但这是一种可行的方法:

<?php
function writeToLog($file, $str, $maxLines = 300) {
    $linesToWrite = explode("\n", $str);
    $numLinesToWrite = count($linesToWrite);
    $logLines = explode("\n", file_get_contents($file));
    array_splice($logLines,
                 $maxLines - $numLinesToWrite,
                 $numLinesToWrite,
                 $linesToWrite);
    file_put_contents($file, implode("\n", $logLines));
}

答案 2 :(得分:0)

不确定这个的表现,但这是我的看法:

// read lines in file as array
$lines = file( 'log.log', FILE_IGNORE_NEW_LINES );

// log file equal to or larger than 300 lines?
if( count( $lines ) >= 300 )
{
    // remove everything from line 0 to 299 from the end
    // in other words keep last 299 lines
    array_splice( $lines, 0, -299 );
}
// append a new line of data
$lines[] = 'Test data ' . time() . "\n";

// put the lines back, first imploding the lines array with a newline char
file_put_contents( 'log.log', implode( "\n", $lines ) );

答案 3 :(得分:0)

这样做的PHP函数。确保日志可写。如果不存在则创建日志:

// keeps log_file <= max_log_lines lines
function logTruncated($report, $log_file, $max_log_lines = 1000)
{
  if (!$report || !$log_file)
    return;
  if (!touch($log_file))
    die('Cant write log: '.$log_file);
  $lines = array_merge(file($log_file), preg_split('/\r?\n/', $report));
  $lines = array_slice($lines, -1 * $max_log_lines);
  file_put_contents($log_file, implode("\n", $lines));
}

答案 4 :(得分:0)

只检查日志文件是否已经存在,如果它大于最大大小(在我的代码中为 4Mb),它将读取它,在开头删除一些文本并添加新文本以保持大小在最大范围内尺寸

$text = "Your text to log";
//if file exists and it's bigger than 4Mb then remove some text at the beginning to limit size
$log_file = __DIR__ . DIRECTORY_SEPARATOR . 'LOGS' . 'log.txt';
    if(file_exists($log_file)){
        clearstatcache();
        $size = filesize($log_file);
        if($size >= 4194304){
            $chunk = file_get_contents($log_file, FALSE, NULL, -(4194304 - strlen($text)));
            $text = $chunk . $text;
            $mode = 0;  //overwrite
        } else $mode = FILE_APPEND;
    }
    $file_exc = file_put_contents($log_file, $text . PHP_EOL , $mode | LOCK_EX);