Как я могу разобрать журнал ошибок Apache в PHP? - PullRequest
17 голосов
/ 01 октября 2008

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

Ответы [ 6 ]

13 голосов
/ 02 октября 2008

Есть несколько вещей, которые нужно рассмотреть в первую очередь:

  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

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

php_flag error_log /web/mysite/logs/error.log
11 голосов
/ 02 октября 2008

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

<?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 голосов
/ 21 декабря 2010

Вот небольшой класс, который позволяет легко прочитать несколько символов с конца большого файла без перегрузки памяти. Настройка теста позволяет увидеть его в действии, уничтожая самого себя.

<code>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's 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
"; } ?>
3 голосов
/ 02 октября 2008

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

0 голосов
/ 02 апреля 2019

adm group имеет доступ для просмотра журналов в системе Linux для доступа к журналу из Apache. Мы должны добавить пользователя www-data в группу adm и перезапустить Apache, чтобы все изменения обновились

$ sudo usermod -G adm www-data
$ sudo service apache2 restart

<?php
 exec('tail /var/log/apache2/error_log', $output);
?>
<Table border="1">
<tr>
    <th>Date</th>
    <th>Type</th>
    <th>Client</th>
    <th>Message</th>
</tr>
<?php
foreach($output as $line) {
    // sample line: [Mon Apr 01 07:23:14.217466 2019] [autoindex:error] [pid 19261] [client 114.143.38.172:55801] AH01276: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>
    <?
}
?>

0 голосов
/ 09 декабря 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...