los - ¿Cómo puedo analizar el registro de errores de Apache en PHP?
php log php ini (5)
Quiero crear un script que analice o tenga sentido 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 hace esto o tiene alguna idea de por dónde empezar.
Hay algunas cosas que considerar primero:
- En primer lugar, su usuario PHP puede no tener acceso a los archivos de registro de Apache.
- En segundo lugar, PHP y Apache no le dirán dónde está dicho archivo de registro,
- Por último, los archivos de registro de Apache pueden ser bastante grandes.
Sin embargo, si no se aplica ninguno de estos, puede 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 hacerlo que no agote la memoria, pero lo dejo 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
Puede configurar esto en httpd.conf o en un archivo .htaccess (si tiene acceso a uno) usando la notación php_flag:
php_flag error_log /web/mysite/logs/error.log
hay montones de scripts de PHP que hacen esto, solo haz una búsqueda en google para ver ejemplos. si quiere hacer su propia versión, no es más complejo que leer cualquier otro archivo. solo asegúrese de conocer la ubicación de sus archivos de registro (definidos en el archivo httpd.conf) y el formato en que se encuentran sus archivos de registro . El formato también se define en httpd.conf.
para cualquier otra persona que busque un guión de muestra, arrojé algo, 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>
¿Has probado biterScripting? Soy un administrador de sistemas y he estado usando para analizar registros. Es un script de estilo univx. biterScripting.com -> Descarga gratuita.
Aquí hay una clase pequeña que facilita la lectura de una cantidad de caracteres desde la parte posterior de un archivo grande sin sobrecargar la memoria. La configuración de prueba te permite verlo en acción canibalizándose a sí mismo.
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>";
}
?>