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

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

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

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

  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('~\] \[([az]*?)\] \[~', $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>"; } ?> в 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>"; } ?> 

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