如何在PHP中解析Apache的错误日志?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (168)

我想创建一个脚本来解析或理解apache的错误日志,以查看最近的错误是什么。我想知道有没有人有这样做或有任何想法从哪里开始?

提问于
用户回答回答于

有几件事需要首先考虑:

  1. 首先,PHP用户可能无法访问Apache的日志文件。
  2. 其次,PHP和Apache不会告诉你上述日志文件在哪里,
  3. 最后,Apache日志文件可以变得相当大。

但是,如果这些都不适用,则可以使用普通的文件读取命令来执行。获得最后一个错误的最简单方法是

$contents = @file('/path/to/error.log', FILE_SKIP_EMPTY_LINES);
if (is_array($contents)) {
    echo end($contents);
}
unset($contents);

这可能是一种更好的方式,它不会记忆,但我会把它作为读者的练习。

最后一条评论:PHP也有一个ini设置来将PHP错误重定向到日志文件: error_log = /path/to/error.log

可以使用php_flag表示法在httpd.conf或.htaccess文件中设置它(如果有权访问):

php_flag error_log /web/mysite/logs/error.log
用户回答回答于
<?php
exec('tail /usr/local/apache/logs/error_log', $output);
?>
<Table border="1">
    <tr>
        <th>Date</th>
        <th>Type</th>
        <th>Client</th>
        <th>Message</th>
    </tr>
<?
    foreach($output as $line) {
        // sample line: [Wed Oct 01 15:07:23 2008] [error] [client 76.246.51.127] PHP 99. Debugger->handleError() /home/gsmcms/public_html/central/cake/libs/debugger.php:0
        preg_match('~^\[(.*?)\]~', $line, $date);
        if(empty($date[1])) {
            continue;
        }
        preg_match('~\] \[([a-z]*?)\] \[~', $line, $type);
        preg_match('~\] \[client ([0-9\.]*)\]~', $line, $client);
        preg_match('~\] (.*)$~', $line, $message);
        ?>
    <tr>
        <td><?=$date[1]?></td>
        <td><?=$type[1]?></td>
        <td><?=$client[1]?></td>
        <td><?=$message[1]?></td>
    </tr>
        <?
    }
?>
</table>

扫码关注云+社区

领取腾讯云代金券