@logbrew/sdk 0.1.40, @logbrew/node 0.1.24 e @logbrew/express 0.1.10. Cada bloco de saída mostra a saída real.
Escolha Winston ou Pino
As duas bibliotecas escrevem logs JSON estruturados. Mantenha a biblioteca que seu app já usa. A configuração do LogBrew é diferente para cada uma.Prepare um projeto do LogBrew
1
Crie uma chave de projeto
Entre na conta com a CLI. Crie um projeto e guarde a chave de ingestão dele em um arquivo que só o dono pode acessar.A CLI não mostra a chave. Em produção, use o gerenciador de segredos da sua plataforma.
2
Instale os pacotes
Os pacotes exigem Node.js 18.19 ou mais recente. Instale Winston, Pino ou os dois.
3
Defina a chave e a identidade da implantação
createLogBrewNodeClient() lê a chave de LOGBREW_SERVER_API_KEY. O nome do serviço é o name do package.json. Defina LOGBREW_SERVICE_NAME para usar outro nome. Os exemplos usam módulos ES, então defina "type": "module" no package.json.Níveis de log no Node.js
Cada biblioteca tem nomes e números de nível próprios. O LogBrew armazena 4 níveis e mantém o nível original nos metadados.
No Winston, um número menor é mais grave. No Pino, um número maior é mais grave. Use
info em produção e debug só para um diagnóstico curto.
Logger do Winston
Salve este arquivo comowinston-app.js. O primeiro formato descarta os registros abaixo do nível do logger antes que qualquer transport os receba. O transport do LogBrew recebe todos os registros que o logger escreve, então ele precisa desse filtro.
node winston-app.js. O console recebe 1 linha JSON para cada registro de nível info ou acima. O rastreamento de pilha (stack trace) aparece encurtado aqui.
context.*.
O transport envia o nome e a mensagem do erro, mas não o rastreamento de pilha. Defina
includeErrorStack: true em createLogBrewWinstonTransport() para enviar o rastreamento de pilha. Cada mensagem também vira um breadcrumb do próximo problema. Defina breadcrumbs: false para desativar isso.
Logger do Pino
Salve este arquivo comopino-app.js. Chame installLogBrewPinoInstrumentation() uma vez, antes do primeiro log. A função lê cada registro do Pino já finalizado. O Pino continua escrevendo no próprio destino.
node pino-app.js. O nome do host e o rastreamento de pilha aparecem encurtados aqui.
debug antes que o LogBrew o veja.
O campo
token não chega ao LogBrew. O LogBrew descarta campos de credenciais, cookies, corpo, query string, URL e rastreamento de pilha. Ele também mantém seus caminhos redact do Pino como um segundo controle. pid, hostname e time são padrões do Pino, então o LogBrew não os copia.
A captura automática exige Pino 9.11 ou mais recente na linha 9.x, ou Pino 10.1 ou mais recente. Para versões mais antigas do Pino, use createLogBrewPinoDestination() do @logbrew/sdk como destino do Pino.
Para ler a saída do Pino em desenvolvimento, envie a saída para o pino-pretty.
Logger do Express
logbrewMiddleware() cria 1 span de requisição para cada requisição. logbrewErrorHandler() informa erros como problemas. Um log do Pino dentro de uma requisição recebe o ID do trace e o ID do span dessa requisição. Salve este arquivo como express-app.js.
O nome do span usa o modelo da rota, não o caminho concreto. O log
listening on 3000 não tem trace, porque fica fora de uma requisição.
Deixe o middleware criar os próprios clientes de requisição. Não passe o client do processo inteiro para logbrewMiddleware() ou logbrewErrorHandler(). O middleware encerra o cliente de requisição depois de cada resposta.
Adicione o trace aos logs do Winston
No Winston, passe o trace ativo para o transport.logbrewTransport à lista transports do logger. Assim, um log do Winston dentro de uma requisição do Express tem o ID do trace e o ID do span da requisição.
Leia os logs de volta
<trace_id> de um trace ou de um problema. Para ler a partir de CI ou de um agente de programação, use uma chave de leitura do projeto. Veja Verificar a configuração.
Encerre sem perder logs
O cliente envia os sinais da fila 1 segundo depois do primeiro sinal ou ao chegar a 50 sinais. Quando o event loop fica vazio, o cliente envia os sinais restantes por no máximo 2 segundos.process.exit() e os sinais do sistema operacional pulam essa etapa. Chame await client.shutdown() antes de sair, como faz o handler de SIGTERM no exemplo do Express.
Solução de problemas
Para escolher os campos de log, veja Logging estruturado. Para outros frameworks, veja Integração do SDK.
