Como escribir un log en PHP

Se puede escribir un log de muchas maneras, podría ir a una base de datos, a un archivo, o a otro servidor. En este artículo vamos a ver como escribir un log en disco de una manera sencilla.

Primero nos vamos a crear un método para escribir el log. Podemos verlo en el siguente trozo de código.

/**
 * Escribe lo que le pasen a un archivo de logs
 * @param string $cadena texto a escribir en el log
 * @param string $tipo texto que indica el tipo de mensaje. Los valores normales son Info, Error,  
 *                                       Warn Debug, Critical
 */
function write_log($cadena,$tipo)
{
	$arch = fopen(realpath( '.' )."/logs/milog_".date("Y-m-d").".txt", "a+"); 

	fwrite($arch, "[".date("Y-m-d H:i:s.u")." ".$_SERVER['REMOTE_ADDR']." ".
                   $_SERVER['HTTP_X_FORWARDED_FOR']." - $tipo ] ".$cadena."\n");
	fclose($arch);
}

El método es muy sencillo y no requiere mucha explicación. Le pasamos dos valores, el primero es la cadena a escribir y el segundo es el tipo de error.

El tipo de error es un string que podemos escribir l oque queramos, pero lo normal es escribir algunos de los valores descritos en el comentario del método ( Info, Error, Warn, Debug, Critical).

Para el tipo se podrían utilizar constantes, pero eso va en gustos.

La función abre un archivo en el directorio “logs” que esta en el directorio rais de nuestro código. El nombre del archivo es log_web_ + la fecha. así conseguimos que el log se rote todos los días y así tengamos un archivo por día. Al poner “a+” estamos diciendole al fopen que se posicione al final del archivo para que añada lo nuevo detras.

Después realizamos la escritura en el archivo abierto poniendo la fecha, la IP, y el tipo de mensaje entre corchetes, y el texto detras. Esto nos permite identificar rápidamente los mensajes y cuando se han escrito.

Por último cerramos el archivo.

Ya tenemos un método que escribe lo siguiente sería utilizarlo. En el siguiente código podemos ver un ejemplo de como se utiliza.

write_log("Estro es una prueba","Debug");
write_log("Se ha producido un error en el método xxxx. el valor de la variable es $variable","Error");
write_log("Navegador: ".$_SERVER['HTTP_USER_AGENT'].$titulo,"Info");

Mi consejo es poner en el inicio de tu código un log indicando la información del usuario que esta navegando y después todo lo que quieras. Esta instrucción podería tener el siguiente formato.

write_log("IP: ".$_SERVER['REMOTE_ADDR']." - ".$_SERVER['HTTP_X_FORWARDED_FOR'].
                             "\nHTTP_HOST: ".$_SERVER['HTTP_HOST']."\nHTTP_REFERER: 
                             ".$_SERVER['HTTP_REFERER']."\nHTTP_USER_AGENT: ".
                             $_SERVER['HTTP_USER_AGENT']."\nREMOTE_HOST: ".
                             $_SERVER['REMOTE_HOST']."\nREQUEST_URI: ".
                             $_SERVER['REQUEST_URI'],"INFO");

El aspecto de nuestro log sería como el siguiente.

[2012-09-06 11:29:21.u 66.220.153.250  - INFO ]IP: 66.220.153.250 - 
HTTP_HOST: www.piensayactua.com
HTTP_REFERER: 
HTTP_USER_AGENT: facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)
REMOTE_HOST: 
REQUEST_URI: /index.php
[2012-09-06 11:29:21.u 66.220.153.250  - Debug ] Estro es una prueba
[2012-09-06 11:29:21.u 66.220.153.250  - Debug ] Se ha producido un error en el método xxxx. el valor 
de la variable es HOLA MUNDO
[2012-09-06 11:29:21.u 66.220.153.250  - Debug ] Navegador:  facebookexternalhit/1.1 
(+http://www.facebook.com/externalhit_uatext.php)

Este código se puede mejorar mucho e incluso utilizar librerías existentes para estos fines.

Espero que os sea de utilidad.