Saltar al contenido principal
LogBrew es una plataforma de observabilidad para desarrolladores y agentes de programación, con un plan gratuito generoso y sin tarjeta. Esta guía configura el logging con Winston y con Pino en Node.js, añade un logger de Express y envía cada log a LogBrew con la traza de su solicitud. Cada ejemplo se ejecutó con Node.js 22, Winston 3.19, Pino 10.4, Express 5.3, @logbrew/sdk 0.1.40, @logbrew/node 0.1.24 y @logbrew/express 0.1.10. Cada bloque de salida muestra su salida real.

Elige Winston o Pino

Las dos bibliotecas escriben logs JSON estructurados. Quédate con la biblioteca que ya usa tu app. La configuración de LogBrew es distinta para cada una.

Prepara un proyecto de LogBrew

1

Crea una clave de proyecto

Inicia sesión con la CLI. Crea un proyecto y guarda su clave de ingesta en un archivo al que solo accede su propietario.
La CLI no muestra la clave. En producción, usa el gestor de secretos de tu plataforma.
2

Instala los paquetes

Los paquetes requieren Node.js 18.19 o posterior. Instala Winston, Pino o los dos.
3

Define la clave y la identidad del despliegue

createLogBrewNodeClient() lee la clave de LOGBREW_SERVER_API_KEY. El nombre del servicio es el name de package.json. Define LOGBREW_SERVICE_NAME para usar otro nombre. Los ejemplos usan módulos ES, así que define "type": "module" en package.json.

Niveles de log en Node.js

Cada biblioteca tiene sus propios nombres y números de nivel. LogBrew guarda 4 niveles y conserva el nivel original en los metadatos. En Winston, un número más bajo es más grave. En Pino, un número más alto es más grave. Usa info en producción y debug solo para un diagnóstico breve.

Logger de Winston

Guarda este archivo como winston-app.js. El primer formato descarta los registros por debajo del nivel del logger antes de que un transport los reciba. El transport de LogBrew recibe todos los registros que escribe el logger, así que necesita este filtro.
Ejecuta node winston-app.js. La consola recibe 1 línea JSON por cada registro de nivel info o superior. Aquí la traza de pila aparece acortada.
LogBrew recibe los mismos 3 registros. Los campos pasan a ser metadatos context.*. El transport envía el nombre y el mensaje del error, pero no la traza de pila. Fija includeErrorStack: true en createLogBrewWinstonTransport() para enviar la traza de pila. Cada mensaje también se convierte en un paso anterior de la siguiente incidencia. Fija breadcrumbs: false para evitarlo.

Logger de Pino

Guarda este archivo como pino-app.js. Llama a installLogBrewPinoInstrumentation() una vez, antes del primer log. La función lee cada registro de Pino terminado. Pino sigue escribiendo en su propio destino.
Ejecuta node pino-app.js. Aquí el nombre del host y la traza de pila aparecen acortados.
LogBrew recibe 3 registros. Pino descarta el registro debug antes de que LogBrew lo vea. El campo token no llega a LogBrew. LogBrew descarta los campos de credenciales, cookies, cuerpo, parámetros de consulta, URL y traza de pila. Además, mantiene tus rutas redact de Pino como segundo control. pid, hostname y time son valores predeterminados de Pino, así que LogBrew no los copia. La captura automática requiere Pino 9.11 o posterior en la línea 9.x, o Pino 10.1 o posterior. Para versiones anteriores de Pino, usa createLogBrewPinoDestination() de @logbrew/sdk como destino de Pino. Para leer la salida de Pino en desarrollo, envíala a pino-pretty.

Logger de Express

logbrewMiddleware() crea 1 span de solicitud por cada solicitud. logbrewErrorHandler() informa de los errores como incidencias. Un log de Pino dentro de una solicitud recibe el ID de traza y el ID de span de esa solicitud. Guarda este archivo como express-app.js.
Inicia la app. Después, envía 2 solicitudes desde una segunda terminal.
LogBrew recibe estos eventos. El log y el span de cada solicitud tienen el mismo ID de traza. El nombre del span usa la plantilla de la ruta, no la ruta concreta. El log listening on 3000 no tiene traza, porque está fuera de una solicitud. Deja que el middleware cree sus propios clientes de solicitud. No pases el client de todo el proceso a logbrewMiddleware() ni a logbrewErrorHandler(). El middleware cierra su cliente de solicitud después de cada respuesta.

Añade la traza a los logs de Winston

Con Winston, pasa la traza activa al transport.
Añade logbrewTransport a la lista transports del logger. Así, un log de Winston dentro de una solicitud de Express tiene el ID de traza y el ID de span de la solicitud.

Vuelve a leer los logs

El último comando lee todos los logs de 1 solicitud. Copia <trace_id> de una traza o de una incidencia. Para leer desde CI o desde un agente de programación, usa una clave de lectura del proyecto. Consulta Verifica tu configuración.

Apaga sin perder logs

El cliente envía los eventos en cola 1 segundo después del primer evento o al llegar a 50 eventos. Cuando el event loop queda vacío, el cliente envía los eventos pendientes durante 2 segundos como máximo. process.exit() y las señales del sistema se saltan ese paso. Llama a await client.shutdown() antes de salir, como hace el handler de SIGTERM del ejemplo de Express.

Soluciona problemas

Para elegir los campos de log, consulta Logging estructurado. Para otros frameworks, consulta Integración del SDK.