Error Log

En esta entrada voy a hablar de «error_log» la opción para almacenar información tales como variables para depurar, guardar errores, comprobar resultados o queries … en PHP.

Uso básico de la función error_log de PHP

Normalmente, durante el desarrollo en PHP, uno siempre necesita debuggear y una de las cosas más usadas es dejar trazas en el log de PHP. Esto es ir almacenando información en un log para comprobar el estado del sistema, o también para dejar rastro de por dónde va pasando la aplicación en desarrollo.

Para ello, podemos usar la función error_log si queremos escribir algo en el fichero de log de PHP. Por defecto se añade en el fichero que esté configurado en php.ini para almacenar la información y los errores de PHP. Aunque, podemos añadir un parámetro a la función y escribir en el fichero que nosotros deseemos.

Para almacenar algo en el log usando PHP, se hace de una manera muy simple, usando la función de PHP «error_log«.

// Variable a salvar
$var = "HOLA";
// Dirección del fichero de log que queremos
$path = "log.log";
// Salvar en el log
error_log($var, 3, $path);

A continuación vamos a explicar el código.

‘$var’ es una variable con lo que queremos salvar en el log, entraré más en profundidad más adelante, para salvar objetos complejos y algunas situaciones excepcionales.

$path es la ruta o path del fichero donde vamos a almacenar $var.

Finalmente, llamando a «error_log($var, 3, $path);» se nos salvará $var en nuestro fichero.

NOTA:

Usamos ‘3’ por defecto para indicarle a la función de «error_log» que el destino es un fichero de texto.

Puedes encontrar más información de error_log en la página oficial de error_log en PHP.net.

Activar error logging en php.ini

Hay que buscar esta directiva log_errors y colocarla a On, por defecto suele estar desactivado .

; Besides displaying errors, PHP can also log errors to locations such as a
; server-specific log, STDERR, or a location specified by the error_log
; directive found below. While errors should not be displayed on productions
; servers they should still be monitored and logging is a great way to do that.
; Default Value: Off
; Development Value: On
; Production Value: On
; http://php.net/log-errors
log_errors = On

Una vez hecho esto, se empezará a almacenar información durante la ejecución de PHP.

Usando error_log para guardar objetos de forma legible

Pero el código anterior, solo nos sirve para almacenar tipos simples.

La mayoría de las veces puede no sernos del todo útil.

Pero por defecto no se guardará de una manera legible al usuario, por lo que necesitamos adaptar un poco el uso que hacemos de error_log.

Para ello, vamos a hacer uso de «print_r» para poder almacenar así, de forma fácil de leer y de entender para el usuario, cualquier tipo de objeto o array.

Además vamos a a

Un ejemplo usando el siguiente código en PHP:

// Código de ejemplo para almacenar un objeto en el log
$test_object = new stdClass();
$test_object->var = "HOLA ";
$test_object->nombre = " PEDRO";
error_log(print_r($test_object, true), 3, "test_log.log");

Usando el código de arriba, tendremos en nuestro fichero de log un resultado como en la imagen siguiente.

error_log - salida de un objeto en fichero de log

En caso de no usar «print_r» no se guardaría nada en el fichero de log.

Usando «print_r» con el objecto a almacenar y el «prettify» marcado a true, esto nos devolverá un string del objeto de una manera fácil de leer y comprender para usuarios. Algo muy útil, sobre todo durante el desarrollo de una aplicación.

Más información de «print_r» en la página oficial de PHP sobre la función print_r.

Creando una función personalizada de error_log

Durante el desarrollo es normal usar muchas veces las llamadas a funciones de log.

Una manera de encapsular y simplificar el código es realizar una función para ello, lo cual será más fácil de recordar y de usar, también evitaremos repetir código en distintos sitios y tendremos un código usable, reutilizable, más limpio y elegante.

Un ejemplo podría ser el siguiente.

// Función para almacenar una variable en el fichero de log.
public function guardar_en_log($data, $path = "log.log")
{
    error_log(print_r($data, true), 3, $path);
    error_log("\xA", 3, $path);
}

// Ejemplos de uso.

// Guardar un string en el fichero de log por defecto de la función.
guardar_en_log("HOLA");
// Guardar una variable en el fichero de log por defecto de la función.
guardar_en_log($var);
// Guardar un string en el fichero "test_log.log".
guardar_en_log("HOLA", "test_log.log");
// Guardar una variable en el fichero "test_log.log".
guardar_en_log($var, "test_log.log");

Como se puede ver, he personalizado una función y he añadido algunos ejemplos de uso.

Por defecto, después de guardar los datos he añadido un salto de línea. Así la siguiente vez que se ejecute la función aparecerá en una nueva línea.

Otros datos interesantes a añadir al log

Podemos añadir la fecha y el tiempo que ha sido añadido.

Para ello podemos usar gmdate:

function addToLog($message)
{
    $logpath = "log.log";
    $logMessage = gmdate("Y-m-d\TH:i:s\Z") . " - LOG TESTING - " . $message . PHP_EOL;
    error_log($logMessage, 3, $logpath);
}

La función anterior nos dará un output como el siguiente:

2020-08-24T10:29:59Z - LOG TESTING - GET
2020-08-24T10:29:59Z - LOG TESTING - Array
(
)

2020-08-24T10:29:59Z - LOG TESTING - POST
2020-08-24T10:29:59Z - LOG TESTING - Array
(
    [mc_gross] => 10.00
    [protection_eligibility] => Eligible
    [tax] => 0.00
    [payment_date] => 03:29:53 Aug 24, 2020 PDT
    [payment_status] => Completed

Enlaces de interés

http://php.net/manual/es/function.error-log.php

http://php.net/manual/es/function.print-r.php

Otras entradas similares

2 Responses to “Error Log”

¿Y tú qué opinas?

Antes de participar en los comentarios, ten en cuenta que leeré personalmente cualquier cosa que escribas. Así que, por favor, mantén las formas y compórtate como una persona de bien.

  • (will not be published)

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>