Question

Je souhaite créer un script qui analyse ou donne un sens au journal des erreurs d’apache pour connaître l’erreur la plus récente. Je me demandais si quelqu'un a quelque chose qui fait cela ou a une idée par où commencer?

Était-ce utile?

La solution

Il y a quelques points à considérer en premier:

  1. Tout d'abord, votre utilisateur PHP peut ne pas avoir accès aux fichiers journaux d'Apache.
  2. Deuxièmement, PHP et Apache ne vous diront pas où se trouve le fichier journal,
  3. Enfin, les fichiers journaux Apache peuvent devenir volumineux.

Toutefois, si aucune de ces solutions ne s’applique, vous pouvez utiliser les commandes de lecture de fichier normales pour le faire. Le moyen le plus simple d’obtenir la dernière erreur est

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

Il existe probablement une meilleure façon de le faire sans mémoire vive, mais je vais laisser cela comme un exercice pour le lecteur.

Un dernier commentaire: PHP dispose également d'un paramètre ini pour rediriger les erreurs PHP vers un fichier journal: error_log = /path/to/error.log

Vous pouvez définir ceci dans httpd.conf ou dans un fichier .htaccess (si vous en avez accès) en utilisant la notation php_flag:

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

Autres conseils

pour ceux qui recherchent un exemple de script, j’ai jeté quelque chose ensemble, c’est la base:

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

il y a des piles de scripts php qui font cela, il suffit de faire une recherche google pour des exemples. si vous voulez lancer le vôtre, rien de plus complexe que de lire un autre fichier. assurez-vous simplement que vous connaissez l'emplacement de vos fichiers journaux (défini dans le fichier httpd.conf) et le formater vos fichiers journaux sont en. le format est également défini dans httpd.conf

Voici une classe de petite taille facilitant la lecture d’un certain nombre de caractères à l’arrière d’un fichier volumineux sans mémoire en surcharge. Le paramètre de test vous permet de le voir en action en se cannibalisant.

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

?> 

Le groupe adm a accès à pour afficher les journaux dans le système Linux pour accéder au journal depuis Apache. Nous devons ajouter l'utilisateur www-data au groupe adm et redémarrer Apache pour que toutes les modifications soient mises à jour

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

Avez-vous essayé le biterScripting? Je suis un administrateur système et j'utilise l'analyse des journaux. C'est un script de style univx. biterScripting.com - > Téléchargement gratuit.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top