Pergunta

Eu quero criar um script que analisa ou faz sentido de log de erro do apache para ver qual foi o erro mais recente. Eu queria saber se alguém aí tem algo que faz isso ou tem alguma idéia por onde começar?

Foi útil?

Solução

Há algumas coisas a considerar em primeiro lugar:

  1. Em primeiro lugar, o usuário PHP podem não ter acesso a arquivos de log do Apache.
  2. Em segundo lugar, PHP e Apache não vão te dizer onde disse arquivo de log é,
  3. Por último, os arquivos de log do Apache pode ficar muito grande.

No entanto, se nenhum destes casos se aplicar, você pode usar os comandos normais de leitura de arquivos para fazê-lo. A maneira mais fácil de obter o último erro é

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

Há provavelmente uma maneira melhor de fazer isso que não oink memória, mas vou deixar isso como um exercício para o leitor.

Um último comentário: PHP também tem uma configuração ini para redirecionar erros do PHP em um arquivo de log: error_log = /path/to/error.log

Você pode definir isso em httpd.conf ou em um arquivo .htaccess (se você tiver acesso a um) usando a notação php_flag:

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

Outras dicas

para qualquer pessoa que esteja procurando um script de exemplo, eu joguei algo juntos, ele tem o 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>

há pilhas de scripts PHP que fazem isso, basta fazer uma pesquisa no google por exemplos. se você desejar construir sua própria, não é nada mais complexo do que lendo qualquer outro arquivo. apenas certifique-se que você sabe a localização de seus arquivos de log (definido no arquivo httpd.conf) eo formatar seus arquivos de log estão em. o formato também é definida em httpd.conf

Aqui está uma classe pequeno-ish que torna mais fácil para ler um número de caracteres da parte de trás de um arquivo grande w / o de memória sobrecarga. A configuração de teste permite que você vê-lo em ação canibalizar-se.

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

?> 

grupo adm tem acesso de visualizar registos no sistema Linux para o acesso do log de apache temos que adicionar o usuário www-data para grupo adm e reinicie o apache para que todas as alterações irão atualizar

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

Você já tentou biterScripting? Eu sou um administrador do sistema e tenho vindo a utilizar para analisar logs. É univx scripting estilo. biterScripting.com -.> Free download

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top