如何在php中保留日志文件的最后n行数

时间:2010-02-11 21:39:41

标签: php logging lines

我想删除旧日志文件中的所有行,并保留最底部的50行。

我怎样才能做这样的事情,如果可能的话,我们可以改变这些线的方向,

normal input

111111
2222222
3333333
44444444
5555555

output like

555555
4444444
3333333
22222
111111

仅在顶部查看新记录,仅查看50或100行。

如何加入这个?

// set source file name and path 
$source = "toi200686.txt"; 
// read raw text as array 
$raw = file($source) or die("Cannot read file"); 
// join remaining data into string 
$data = join('', $raw); 
// replace special characters with HTML entities 
// replace line breaks with <br />  
$html = nl2br(htmlspecialchars($data)); 

它将输出作为HTML文件。那么你的代码将如何运行呢?

5 个答案:

答案 0 :(得分:7)

$lines = file('/path/to/file.log'); // reads the file into an array by line
$flipped = array_reverse($lines); // reverse the order of the array
$keep = array_slice($flipped,0, 50); // keep the first 50 elements of the array

从那里你可以使用$keep进行任何操作。例如,如果你想把它吐出来:

echo implode("\n", $keep);

file_put_contents('/path/to/file.log', implode("\n", $keep));

答案 1 :(得分:3)

这有点复杂,但由于整个文件未加载到数组中,因此占用的内存较少。基本上,它保留一个N长度的数组,并在从文件中读取时按下新行,同时切换一个。因为新行是由fgets返回的,所以即使使用填充数组,你也可以简单地进行内爆以查看N行。

<?php
$handle = @fopen("/path/to/log.txt", "r");
$lines = array_fill(0, $n-1, '');

if ($handle) {
    while (!feof($handle)) {
        $buffer = fgets($handle);
        array_push($lines, $buffer);
        array_shift($lines);
    }
    fclose($handle);
}

print implode("",$lines);
?>

只是展示另一种做事方式,特别是如果您没有tail可供使用。

答案 2 :(得分:1)

这可以用于截断日志文件:

exec("tail -n 50 /path/to/log.txt", $log);
file_put_contents('/path/to/log.txt', implode(PHP_EOL, $log));

这将返回tail$log的输出并将其写回日志文件。

答案 3 :(得分:0)

最佳形式是:

<?
print `tail -50 /path/to/file.log`;
?>

答案 4 :(得分:0)

此方法使用关联数组每次仅存储$tail个行数。它没有用所有行填充整个数组

$tail=50;
$handle = fopen("file", "r");
if ($handle) {
    $i=0;
    while (!feof($handle)) {
        $buffer = fgets($handle,2048);
        $i++;
        $array[$i % $tail]=$buffer;
    }
    fclose($handle);
    for($o=$i+1;$o<$i+$tail;$o++){
        print $array[$o%$tail];
    }
}