Cómo logear errores con PHP

Es una realidad conocida por todos los programadores el hecho de que, por más esfuerzo que pongamos, los usuarios se las arreglan para encontrar errores antes que nosotros :).

No sólo eso, lo más probable es que, al reportar un error (o intentar hacerlo), no tengan mucho más para decirnos que «No hice nada y el sistema se colgó»… evidentemente, no es un panorama muy alentador como punto de partida para encontrar (e implementar) una solución, ¿cierto?

Es ahí donde tener un buen log de errores puede hacer la diferencia entre perder el relax del fin de semana o dejar a superman opacado en los ojos del cliente.

Veamos entonces algunas técnicas para contar con esa información cuando se la necesita (y sí… tarde o temprano la vas a necesitar).

La primera opción es casi obvia: guardar los logs mediante tu propio mecanismo (mucho fopen, fwrite o similares, etc…). Claramente esto puede hacerse (¡y hasta puede funcionar bien!) pero representa un esfuerzo importante y una gran propensión a generar más errores que los que previene.

Por ejemplo, hay que tener en cuenta que, si la cantidad de usuarios concurrentes es alta (como se espera en un entorno web) habrá problemas de disponibilidad del archivo donde se almacenan los logs, con lo cual probablemente tengas que implementar tu propio sistema de semáforos o algo así… un poco demasiado para lo que estamos queriendo lograr, ¿no?

En ese sentido, PHP te provee una función bastante interesante: error_log, que ya maneja toda esa complejidad por vos… no está mal, ¿cierto? (De hecho, esta función puede usarse para guardar información de cualquier tipo, no sólo de errores).

Pero, como de costumbre, podemos encontrarnos con casos aún más complejos, como ser un sistema distribuido que requiere de logs centralizados. Un caso típico es cuando se trata de muchos servidores detrás de un balanceador de carga:

En este caso, probablemente te interese que si hay errores en cualquiera de los servidores se tomen como un único error de la aplicación, con lo cual, los archivos de logs individuales de cada servidor tendrán poca relevancia.

Nuevamente, aquí podés optar (entre otras) por:

  • Guardar los logs en un archivo compartido entre los servidores (por ejemplo por NFS o similar)… poco recomendable (mala performance, mala seguridad, etc…)
  • Guardar los logs en una base de datos compartida
  • Enviar los errores directamente por email
  •  
  • Y aquí es donde te conviene empezar a pensar en usar alguna librería que maneje todo esto… te presento Monolog.

Monolog es precisamente eso: una librería hecha especialmente para manejar procesos de logging complejos. Permite entre otras cosas diferenciar almacenamiento de logs en función de la gravedad de los sucesos (que vos también podés definir).

Y vos… ¿Cómo manejás tus logs?

mchojrin

Por mchojrin

Ayudo a desarrolladores PHP a acceder mercados y clientes más sofisticados y exigentes