Su aplicación PHP no habla, le gritan
\n\nImagínese que es el capitán de una nave espacial. Su tarea es llegar a Marte. Pero la nave no tiene instrumentos, ni sensores, ni siquiera un botón de "alarma de emergencia". Simplemente vuela, esperando lo mejor. Así más o menos se siente un desarrollador que lanza una aplicación PHP a producción sin monitoreo ni registro.
\n\nLos usuarios ven "500 Internal Server Error", y usted solo ve una pantalla vacía de logs. ¿Le suena familiar? Si no es así, o es un genio o simplemente aún no se ha enfrentado a la caída de un servidor en producción a las 3 de la madrugada.
\n\nEn este artículo, analizaremos cómo convertir su aplicación PHP de una "caja negra" en un sistema transparente que le cuente por sí mismo dónde y por qué falló. Le mostraré código real, mejores prácticas y herramientas que se utilizan en producción en proyectos grandes. ¡Allá vamos!
\n\nPor qué el registro en PHP no es solo un "echo"
\n\nMuchos principiantes piensan que el registro es:
\n\necho "Aquí hay un error: " . $error;\n\nSpoiler: esto no funciona en producción. El usuario verá esa "belleza" en la pantalla. Y si el error es fatal, usted no se enterará de nada.
\n\nEl registro real es la recopilación estructurada de datos que se pueden analizar, buscar y a los que se puede reaccionar en tiempo real. PHP proporciona funciones básicas (error_log(), syslog()), pero en el mundo moderno esto no es suficiente.
¿Qué debe tener un buen log?
\n- \n
- Nivel de gravedad — DEBUG, INFO, WARNING, ERROR, CRITICAL \n
- Marca de tiempo — hora exacta del evento (preferiblemente en UTC) \n
- Contexto — ID de usuario, IP, URL, datos de la solicitud \n
- Stack de llamadas — trace del error \n
- Identificador único de solicitud — para vincular todos los logs de una misma acción \n
Monolog — el estándar de registro en PHP
\n\nSi escribe en PHP y no usa Monolog — está perdiendo el tiempo. Es el estándar de facto para el registro, compatible con Symfony, Laravel y la mayoría de los frameworks modernos.
\n\n¿Por qué Monolog es genial?
\n- \n
- "Handlers" flexibles — se puede escribir en archivo, BD, Telegram, Slack, email \n
- Formateadores — JSON, HTML, Syslog \n
- Procesadores — añaden contexto automáticamente \n
Instalación y ejemplo básico
\n\ncomposer require monolog/monolog\n\nAhora escribamos un logger simple:
\n\n<?php\nrequire 'vendor/autoload.php';\n\nuse Monolog\\Logger;\nuse Monolog\\Handler\\StreamHandler;\nuse Monolog\\Handler\\TelegramBotHandler;\nuse Monolog\\Level;\n\n// Creamos el logger con nombre de canal\n$log = new Logger('my_app');\n\n// Escribimos en archivo\n$log->pushHandler(\n new StreamHandler(__DIR__ . '/logs/app.log', Level::Debug)\n);\n\n// Errores críticos — a Telegram\n$log->pushHandler(\n new TelegramBotHandler(\n 'YOUR_BOT_TOKEN',\n 'YOUR_CHAT_ID',\n Level::Critical\n )\n);\n\n// Usamos\n$log->info('Usuario inició sesión', ['user_id' => 123]);\n$log->error('Base de datos no disponible', ['db_host' => 'localhost']);\n\nTenga en cuenta: usamos diferentes handlers para diferentes niveles. En el archivo se escribe todo (depuración), y a Telegram solo lo crítico. Esto permite no saturar con notificaciones, pero no pasar por alto un problema real.
\n\nMonitoreo de PHP: cómo ver lo que está oculto
\n\nEl registro es la recopilación pasiva de datos. El monitoreo es la observación y notificación activa. Si un usuario le informa de un error — ya llegó tarde. Un buen monitoreo le alertará antes de que el problema afecte a los usuarios.
\n\nSentry — imprescindible para el desarrollador PHP
\n\nSentry es un sistema de seguimiento de errores en tiempo real. Captura excepciones, recopila contexto, stack de llamadas e incluso datos de sesión.