1

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

GitHub: https://github.com/rickferrdev/bea-logger

Carregando publicação patrocinada...