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