Bea Logger: um logger simples e flexível para TypeScript 🌸
Desenvolvi o Bea Logger, uma biblioteca pequena e independente de transport para aplicações TypeScript. A proposta é separar a formatação dos logs do destino para o qual eles serão enviados, mantendo a API simples e extensível.
O projeto oferece formatadores para saídas coloridas, simples, detalhadas e em JSON. Também aceita contexto estruturado, transports síncronos ou assíncronos, gravação em arquivos e estratégias de fallback quando um transport falha.
O pacote funciona com Node.js 20.12 ou superior e inclui as declarações de tipos.
Começando
A instalação pode ser feita com Bun ou npm:
bun add @rickferrdevelop/bea-logger
npm install @rickferrdevelop/bea-logger
Um logger básico pode ser criado assim:
import * as bea from "@rickferrdevelop/bea-logger";
const logger = bea.createLogger({
transport: bea.transports.console,
});
await logger.info("Servidor iniciado");
await logger.warn("A resposta está demorando");
await logger.error("Não foi possível conectar ao banco");
Cada método retorna uma Promise. Isso permite aguardar a entrega do log e tratar possíveis falhas dos transports.
Também é possível adicionar informações estruturadas:
await logger.info("Usuário criado", {
userId: "42",
role: "admin",
});
O contexto fica disponível para formatadores e transports personalizados. Com o formatador JSON, por exemplo, o resultado pode ser enviado diretamente para uma API ou ferramenta de observabilidade.
Transports e fallbacks
Um logger pode enviar a mesma entrada para mais de um destino:
const logger = bea.createLogger({
formatter: bea.format.json,
transport: [
bea.transports.console,
bea.transports.file({
filename: "./logs/app.json",
}),
],
});
Transports personalizados recebem os dados originais e o texto já formatado:
const apiTransport: bea.Transport = async (data, formatted) => {
const response = await fetch("https://example.com/logs", {
method: "POST",
headers: {
"content-type": "application/json",
},
body: JSON.stringify({ data, formatted }),
});
if (!response.ok) {
throw new Error(`Falha ao enviar log: ${response.status}`);
}
};
Caso um destino fique indisponível, é possível configurar um fallback:
const resilientTransport = bea.transports.fallback({
transport: apiTransport,
fallback: bea.transports.file({
filename: "./logs/failed-deliveries.log",
}),
onError: (error) => {
console.error("Transport remoto indisponível", error);
},
});
const logger = bea.createLogger({
transport: resilientTransport,
});
Também é possível continuar executando os transports seguintes depois de uma falha:
const logger = bea.createLogger({
transport: [apiTransport, bea.transports.console],
transportFailure: "continue",
onTransportError: ({ error, transportIndex }) => {
console.error(`Transport ${transportIndex} falhou`, error);
},
});
O Bea Logger substitui o pacote antigo @rickferrdev/bea-logger. Novos projetos devem utilizar @rickferrdevelop/bea-logger.
O código é aberto sob a licença MIT.
NPM: https://www.npmjs.com/package/@rickferrdevelop/bea-logger