Pregunta

Quiero crear un script que analice o comprenda el registro de errores de apache para ver cuál fue el error más reciente. Me preguntaba si alguien por ahí tiene algo que haga esto o tiene alguna idea de por dónde empezar.

¿Fue útil?

Solución

Primero hay que considerar algunas cosas:

  1. En primer lugar, es posible que su usuario de PHP no tenga acceso a los archivos de registro de Apache.
  2. En segundo lugar, PHP y Apache no te dirán dónde está dicho archivo de registro,
  3. Por último, los archivos de registro de Apache pueden ser bastante grandes.

Sin embargo, si ninguno de estos se aplica, puedes usar los comandos normales de lectura de archivos para hacerlo. La forma más fácil de obtener el último error es

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

Probablemente haya una mejor manera de hacer esto que no recuerde la memoria, pero lo dejaré como un ejercicio para el lector.

Un último comentario: PHP también tiene una configuración ini para redirigir los errores de PHP a un archivo de registro: error_log = /path/to/error.log

Puedes configurarlo en httpd.conf o en un archivo .htaccess (si tienes acceso a uno) usando la notación php_flag:

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

Otros consejos

para cualquier otra persona que busque un script de muestra, hice algo juntos, tiene lo básico:

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

hay montones de scripts php que hacen esto, solo haz una búsqueda en google de ejemplos. si quieres rodar el tuyo, no es nada más complejo que leer cualquier otro archivo. simplemente asegúrese de conocer la ubicación de sus archivos de registro (definidos en el archivo httpd.conf) y el formato de sus archivos de registro está en. el formato también se define en httpd.conf

Aquí hay una clase pequeña que facilita la lectura de varios caracteres desde la parte posterior de un archivo grande sin sobrecarga de memoria. La configuración de prueba le permite verla en acción canibalizándose a sí misma.

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

?> 

el grupo adm tiene acceso para ver los registros en el sistema linux para acceder al registro desde apache. Tenemos que agregar el usuario www-data al grupo adm y reiniciar el apache para que todos los cambios se actualicen

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

¿Has probado biterScripting? Soy un administrador del sistema y he estado usando para analizar registros. Es un script de estilo univx. biterScripting.com - > Descarga gratuita.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top