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

StackOverflow https://stackoverflow.com/questions/159393

  •  03-07-2019
  •  | 
  •  

Вопрос

Я хочу создать сценарий, который анализирует или анализирует журнал ошибок 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

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

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>

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

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

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</pre>";
}

?> 

Группа adm имеет доступ для просмотра журналов в системе 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>
    <?
}
?>

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top