Crear un simple logger en PHP para depurar y escribir errores en archivo de texto

Depurar nuestro código de PHP es uno de los pasos más importantes de la programación. Una gran ayuda que tenemos a nuestra disposición son los logs o archivos de log.

Hoy veremos cómo escribir mensajes de error y depuración (o debug) en archivos de texto usando PHP sin usar librerías externas, únicamente funciones nativas y un poco de código al inicio de nuestro script.

Gracias a esto podremos escribir mensajes de información y también llevar un registro de errores sin mostrarlos al usuario, con fecha y hora de llamada así como el script de llamada.

Un ejemplo del log que vamos a crear (esto dependerá de tu app pero para que te des una idea) es este:

Veamos entonces cómo loguear con PHP, además de evitar mostrar los errores al usuario, asegurando nuestras aplicaciones web.

Configurar archivo de log y ocultar errores al usuario

El propósito de un error log es:

  • No mostrar mensajes de error que un atacante podría aprovechar
  • Depurar código imprimiendo mensajes al archivo
  • Atrapar todos los errores y llevar un registro de los mismos con fecha y hora así como toda la pila de errores y stack trace

Entonces nuestro archivo en donde configuramos todo eso debe quedar así:

Para usarlo simplemente hay que incluirlo en la parte superior de nuestros archivos en donde lo vamos a ocupar y, a partir de ello, cualquier error se va a ocultar al usuario y en su lugar se va a imprimir en el archivo.

Como vemos, cada día se creará un nuevo archivo y tendrá como nombre la fecha que indicará el año, mes y día. De esta manera, podemos ver los errores que han ocurrido con el paso del tiempo.

Recuerda que todos los archivos de log serán creados en la carpeta definida por RUTA_LOGS, puedes cambiarla según tus necesidades.

Explicación del logger

Los ajustes en donde llamamos a ini_set son para modificar el archivo ini de PHP y, en el orden en el que aparecen hacen lo siguiente:

  1. Ocultan los errores, es decir, no muestran el mensaje en la página web. Esto se logra poniendo display_errors en 0
  2. Indicar que sí queremos loguear los errores, poniendo log_errors en 1
  3. Guardar la ruta del archivo en donde se van a escribir los errores o mensajes configurando error_log y pasándole la ruta del fichero.

Más abajo veremos un ejemplo. Te recomiendo ver cómo trabajar con archivos en PHP.

Ejemplo de uso de logger que acabamos de crear

Podemos depurar llamando a error_log y pasándole un mensaje. En caso de que se genere un error, será impreso en el archivo.

Finalmente, si se produce una excepción no controlada, también se pondrá en el log y se le mostrará al usuario el mensaje de “Esta página no funciona”.

Para usar el logger simplemente inclúyelo en donde lo vas a usar, recomiendo incluirlo antes que todo. En mi caso queda así y hago algunas pruebas:

El script fue para probar, pero si alguna función o clase produce un error, será logueado en el archivo. De esta manera tendrás un registro de todos los movimientos que se hacen.

Te invito a ver más sobre var_export y la notación corta de los arreglos.

Sobre la seguridad

Por cierto, cabe mencionar que nunca en tu vida debes loguear contraseñas o claves de acceso en un log, es una mala práctica y una posible vulnerabilidad.

Bonus: proteger acceso a carpeta de logs

Ya lo dije hace un momento, puedes mover la carpeta de logs a un directorio no público, pero en caso de que lo dejes en el mismo, debes protegerlo y restringirlo, porque cualquier usuario podría ver la carpeta (y su contenido) desde el navegador:

Directorio de logs expuesto al público

Directorio de logs expuesto al público

Dependiendo de tu servidor puedes aplicar distintas configuraciones, en este caso lo haré con Apache. Creamos un archivo llamado .htaccess (mira cómo habilitarlo si no lo está) y su contenido es el siguiente:

Ahora cuando alguien quiere entrar a la carpeta, se muestra esto:

Acesso prohibido a logs creados con PHP

Acesso prohibido a logs creados con PHP

Mira más sobre denegar o proteger acceso a carpetas y archivos con Apache.

Y no te preocupes, tampoco se puede acceder a los archivos individuales; pero tú sí podrás verlos desde FTP o el sistema de archivos, además de que PHP podrá seguir escribiendo. En resumen, los archivos de log se restringen al público.

Conclusiones

¿Quieres leer más sobre PHP? haz click aquí.

Estoy interesado en trabajar contigo de manera remota para llevar tu idea a la realidad, formar parte de tu equipo de desarrolladores, ayudarte con tu tarea, dar asesorías y todo lo relacionado con tecnología y programación. Contáctame para más información
No te vayas sin seguirme en Twitter, Facebook y GitHub
Si tienes dudas déjalas en un comentario, pero asegúrate de seguirme antes como agradecimiento (no te cuesta nada y me ayudas mucho)


parzibyte

He trabajado por más de 4 años en el desarrollo de software con experiencia en Java, PHP, JavaScript, HTML, Node.JS, Python, Android y Go. También he trabajado con bases de datos SQL como MySQL y SQLite, así como con bases de datos NoSQL usando MongoDB. Soy bueno utilizando algunos frameworks y herramientas como Firebase, jQuery, AngularJS, VueJS, CodeIgniter, Laravel, BulmaCSS, Bootstrap y Electron. Otros términos que conozco son: Arduino, GraphQL, API's, REST, AJAX, PouchDB, CouchDB, Experiencia de usuario, buenas prácticas de programación, Webpack, NPM, Administración de servidores y programación de scripts La plataforma en la que tengo más experiencia es la web, pero en mis ratos libres realizo unos pequeños ejercicios en C# y C. Estoy aquí para ayudarte a resolver tus problemas de programación y depuración :-)

1 Comment

Laravel: Loguear errores y mensajes a archivo de log con Monolog - Parzibyte's blog · febrero 18, 2019 a las 2:00 am

[…] Por cierto, si no quieres loguear con Laravel y quieres usar el lenguaje puro, mira este post: Loguear mensajes de error y debug a archivos con PHP. […]

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

A %d blogueros les gusta esto: