Logging para JavaScript (Node.js): melhores soluções
Logging não é apenas registrar erros. É sua principal ferramenta para depuração, monitoramento e análise do funcionamento da aplicação. No ecossistema Node.js, existem muitas bibliotecas, cada uma voltada para diferentes tarefas: desde a simples saída no console até sistemas poderosos com rotação de arquivos e integração com serviços externos. Neste artigo, vamos analisar as quatro soluções mais populares — Winston, Pino, Bunyan e Morgan — e ajudá-lo a escolher a opção ideal para o seu projeto.
Por que o logging é necessário no Node.js?
Os logs ajudam o desenvolvedor a entender o que está acontecendo dentro do servidor a qualquer momento. Sem eles, você estará "voando às cegas", especialmente em ambiente de produção. As principais tarefas que o logging resolve são:
- Depuração de erros — busca rápida pela causa da falha da aplicação.
- Monitoramento de desempenho — acompanhamento do tempo de resposta, carga de CPU e memória.
- Auditoria de ações do usuário — registro de operações-chave (registro, pagamento, alteração de dados).
- Segurança — registro de requisições suspeitas e tentativas de invasão.
Um sistema de logging de qualidade deve suportar diferentes níveis (debug, info, warn, error), saber formatar a saída e salvar dados em arquivos, bancos de dados ou serviços remotos.
1. Winston — a escolha universal
Winston é o padrão de facto para logging em Node.js. Ele é flexível, possui múltiplos transports (para onde escrever os logs) e é facilmente configurável para qualquer necessidade.
Características:
- Suporte a múltiplos transports: console, arquivo, HTTP, MongoDB, Elasticsearch e outros.
- Formatos personalizados (JSON, texto simples, timestamps).
- Possibilidade de criar seus próprios transports e formatadores.
- Trabalho com profiling (medição de tempo de execução).
Exemplo de instalação e configuração:
npm install winstonconst winston = require('winston');
const logger = winston.createLogger({ level: 'info', format: winston.format.combine( winston.format.timestamp(), winston.format.json() ), transports: [ new winston.transports.Console(), new winston.transports.File({ filename: 'error.log', level: 'error' }), new winston.transports.File({ filename: 'combined.log' }) ]});
logger.info('Aplicação iniciada');logger.error('Erro ao conectar ao banco de dados');Quando usar: para projetos médios e grandes, onde é necessária flexibilidade e integração com sistemas externos.
2. Pino — logger ultrarrápido
Se o desempenho é crítico (por exemplo, APIs de alta carga ou microsserviços), considere o Pino. Ele é considerado o logger mais rápido para Node.js devido ao mínimo overhead de parsing.
Características:
- Latência extremamente baixa (~5-10 vezes mais rápido que o Winston).
- Saída em formato JSON por padrão (ideal para processamento por máquina).
- Suporte a child loggers para logging contextual.
- Pretty-print integrado para desenvolvimento (pino-pretty).
Exemplo de configuração:
npm install pinoconst pino = require('pino');
const logger = pino({ level: process.env.LOG_LEVEL || 'info', transport: { target: 'pino-pretty', options: { colorize: true } }});
logger.info({ user: 'alice' }, 'Usuário autenticado');logger.error(new Error('Falha ao carregar arquivo'));Quando usar: em projetos com altos requisitos de velocidade e consumo mínimo de recursos.
3. Bunyan — simplicidade e estruturação
Bunyan, da empresa Joyent, é outro log
Também na biblioteca
Trabalho com Markdown em C++: bibliotecas, parsers e ferramentas
Monitoramento de aplicações .NET com Prometheus e OpenTelemetry
Filas de Tarefas em Java: ExecutorService e ThreadPoolExecutor
Geração de PDF em Kotlin: visão geral de bibliotecas e ferramentas