Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I parse Apache's error log in PHP?

I want to create a script that parses or makes sense of apache's error log to see what the most recent error was. I was wondering if anyone out there has something that does this or has any ideas where to start?

like image 359
SeanDowney Avatar asked Oct 01 '08 19:10

SeanDowney


2 Answers

There are a few things to consider first:

  1. Firstly, your PHP user may not have access to Apache's log files.
  2. Secondly, PHP and Apache aren't going to tell you where said log file is,
  3. Lastly, Apache log files can get quite large.

However, if none of these apply, you can use the normal file reading commands to do it. The easiest way to get the last error is

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

There's probably a better way of doing this that doesn't oink up memory, but I'll leave that as an exercise for the reader.

One last comment: PHP also has an ini setting to redirect PHP errors to a log file: error_log = /path/to/error.log

You can set this in httpd.conf or in an .htaccess file (if you have access to one) using the php_flag notation:

php_flag error_log /web/mysite/logs/error.log
like image 197
Powerlord Avatar answered Oct 05 '22 23:10

Powerlord


for anyone else looking for a sample script, i threw something together, it's got the basics:

<?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>
like image 37
SeanDowney Avatar answered Oct 06 '22 01:10

SeanDowney