2008-10-01 15 views

Odpowiedz

13

Jest kilka rzeczy do rozważenia pierwszy:

  1. Po pierwsze, twój użytkownik PHP mogą nie mieć dostępu do plików dziennika Apache.
  2. Po drugie, PHP i Apache nie powiedzą ci, gdzie jest wymieniony plik logu,
  3. Wreszcie, pliki dziennika Apache mogą stać się dość duże.

Jeśli jednak żadna z powyższych nie ma zastosowania, można użyć zwykłych poleceń odczytu pliku. Najłatwiej dostać ostatni błąd jest

$contents = @file('/path/to/error.log', FILE_SKIP_EMPTY_LINES); 
if (is_array($contents)) { 
    echo end($contents); 
} 
unset($contents); 

Nie ma chyba lepszego sposobu na osiągnięcie tego, że nie OiNK pamięć, ale zostawię to jako ćwiczenie dla czytelnika.

Ostatni komentarz: PHP ma również ini ustawienie przekierowania błędy PHP do pliku dziennika: error_log = /path/to/error.log

Można ustawić to w httpd.conf lub w pliku .htaccess (jeśli masz dostęp do jednego) za pomocą notacji php_flag:

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

"Ćwiczenie dla czytelnika", o, ile razy to słyszałem. ;) – willasaywhat

+2

Cóż, w tym przypadku oznacza to, że jestem w pracy i nie mam dużo czasu, aby napisać kod niezwiązany z pracą. :) – Powerlord

3

są tam stosy skryptów php, które to robią, wystarczy wyszukać w Google przykłady. Jeśli chcesz przetasować własne, nie jest to nic bardziej skomplikowanego niż czytanie jakiegokolwiek innego pliku. po prostu upewnij się, że znasz położenie plików logów (zdefiniowanych w pliku httpd.conf) i format your log files. Format jest również zdefiniowany w httpd.conf

10

dla każdego, kto szuka przykładowego skryptu, rzuciłem coś razem, ma podstawy:

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

Czy próbowałeś biterScripting? Jestem administratorem systemu i używam go do analizowania dzienników. Jest to skrypt w stylu univx. biterScripting.com -> Bezpłatne pobieranie.

3

Oto mała klasa, która ułatwia odczytanie wielu znaków z tyłu dużego pliku bez przeciążenia pamięci. Ustawienie testowe pozwala zobaczyć, jak działa samo kanibalizowanie.

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

?> 
Powiązane problemy