Как я могу анализировать журнал ошибок Apache в PHP?

Я хочу создать script, который анализирует или анализирует журнал ошибок apache, чтобы узнать, какая была последняя ошибка. Мне было интересно, есть ли у кого-нибудь что-то, что делает это, или есть идеи, с чего начать?

Ответы

Ответ 1

Вначале необходимо рассмотреть несколько вещей:

  • Во-первых, ваш пользователь PHP может не иметь доступа к файлам журнала Apache.
  • Во-вторых, PHP и Apache не собираются сообщать вам, где находится файл журнала,
  • Наконец, файлы журнала 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

Вы можете установить это в httpd.conf или в файле .htaccess(если у вас есть доступ к одному), используя нотацию php_flag:

php_flag error_log /web/mysite/logs/error.log

Ответ 2

для всех, кто ищет образец script, я бросил что-то вместе, он получил основы:

<?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>

Ответ 3

есть кучи php-скриптов, которые делают это, просто выполните поиск по Google для примеров. если вы хотите сворачивать свои собственные, это не более сложное, чем чтение любого другого файла. просто убедитесь, что вы знаете местоположение ваших файлов журналов (определено в файле httpd.conf), а форматирует файлы журнала. Формат также определяется в httpd.conf

Ответ 4

Здесь класс small-ish, который позволяет легко считывать несколько символов с обратной стороны большого файла без перегрузки памяти. Параметр теста позволяет увидеть его в действии, любящем себя.

BigFile.php
<?php
$run_test = true;
$test_file = 'BigFile.php';

class BigFile
{
private $file_handle;

/**
 * 
 * Load the file from a filepath 
 * @param string $path_to_file
 * @throws Exception if path cannot be read from
 */
public function __construct( $path_to_log )
{
    if( is_readable($path_to_log) )
    {
        $this->file_handle = fopen( $path_to_log, 'r');
    }
    else
    {
        throw new Exception("The file path to the file is not valid");
    } 
}

/**
 * 
 * 'Finish your breakfast' - Jay Z homme Strict
 */
public function __destruct()
{
    fclose($this->file_handle); 
}

/**
 * 
 * Returns a number of characters from the end of a file w/o loading the entire file into memory
 * @param integer $number_of_characters_to_get
 * @return string $characters
 */
public function getFromEnd( $number_of_characters_to_get )
{
    $offset = -1*$number_of_characters_to_get;
    $text = "";

    fseek( $this->file_handle, $offset , SEEK_END);

    while(!feof($this->file_handle))
    {
        $text .= fgets($this->file_handle);
    }

    return $text;
}
}

if( $run_test )
{
$number_of_characters_to_get =  100000; 
$bf = new BigFile($test_file);
$text = $bf->getFromEnd( $number_of_characters_to_get );
echo "$test_file has the following $number_of_characters_to_get characters at the end: 
    <br/> <pre>$text</pre>";
}

?> 

Ответ 5

Вы пробовали использовать biterScripting? Я системный администратор, и я использую для анализа журналов. Это унифицированный стиль. biterScripting.com → Бесплатно скачать.