Frage

Ich mag ein Skript erstellen, das Gefühl des Fehlerprotokolls des Apache analysiert oder macht zu sehen, was der letzte Fehler war. Ich habe mich gefragt, ob jemand da etwas hat, das dies tut oder hat irgendwelche Ideen, wo anfangen?

War es hilfreich?

Lösung

Es gibt ein paar Dinge zu beachten, zuerst:

  1. Zum einen PHP-Benutzer haben keinen Zugriff auf die Apache-Log-Dateien.
  2. Zweitens, PHP und Apache werden Ihnen nicht sagen, wo Protokolldatei gesagt ist,
  3. Schließlich Dateien Apache Protokoll kann ziemlich groß werden.

Wenn jedoch keines dieser anwenden, können Sie die normale Datei Lesebefehle verwenden, es zu tun. Der einfachste Weg, den letzten Fehler zu bekommen, ist

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

Es gibt wahrscheinlich einen besseren Weg, dies zu tun, die nicht Speicher nicht oink, aber ich werde das für den Leser als Übung überlassen.

Ein letzter Kommentar: PHP hat auch eine ini Einstellung PHP-Fehler in eine Log-Datei zu umleiten: error_log = /path/to/error.log

Sie können diese Einstellung in httpd.conf oder in einer .htaccess-Datei (wenn Sie den Zugriff auf eine haben) mit der php_flag Notation:

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

Andere Tipps

für alle andere für einen Beispielskript suchen, warf ich etwas zusammen, es ist, die Grundlagen bekommt:

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

Es gibt Haufen von PHP-Skripte, die dies tun, nur für Beispiele eine Google-Suche. wenn Sie Ihre eigene Rolle mögen, ist es nichts komplexer als jede andere Datei zu lesen. so stellen Sie sicher, dass Sie den Speicherort Ihres Logfiles (definiert in der Datei httpd.conf) und die Format Ihrer Log-Dateien in sind. das Format auch in httpd.conf

Hier ist eine kleine ish-Klasse, die Speicher w / o Überlastung es leicht zu lesen eine Anzahl von Zeichen von der Rückseite einer großen Datei macht. Die Test Einstellung können Sie es in Aktion zu sehen kannibalisieren selbst.

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 Gruppe hat Zugriff von Protokollen in Linux-System zu betrachten, das Protokoll von Apache zugreifen wir www-data Benutzer adm group und starten Sie den Apache hinzuzufügen haben, so dass alle Änderungen aktualisiert

$ 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>
    <?
}
?>

Haben Sie biterScripting versucht? Ich bin ein Systemadministrator und ich habe mit Protokolle zu analysieren. Es ist univx Stil Scripting. biterScripting.com -.> Free Download

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top