Loki Console Logger JS

Elven Observability Official Logger

Um coletor de logs, eventos e exceções para apps Node.js que envia tudo ao Grafana Loki. Oferece interceptação automática de console, suporte a labels dinâmicas, envio assíncrono com buffer e integração instantânea com o Elven Stack.


1✨ Features

⚡ Alta performance com buffer assíncrono e envio em lote

🔗 Captura automática de:

  • console.log, console.error, console.warn, etc
  • Exceções não tratadas
  • Eventos personalizados via trackEvent

🏷️ Suporte a labels fixas e dinâmicas (com trace/span id via OpenTelemetry)

📦 Buffer com envio em lote configurável

✅ Resiliente a falhas de rede

🧵 Compatível com apps simples ou complexos (ex: web servers, workers)

🔁 Garantia de envio no encerramento do processo


2📦 Instalação

npm install loki-console-logger-js

3🚀 Uso Básico

import { interceptConsole, trackEvent } from "loki-console-logger-js";

interceptConsole({
  url: "https://loki.elvenobservability.com/loki/api/v1/push",
  tenantId: "seu-tenant", // Seu Tenant ID
  appName: "my-js-app",
  authToken: "seu-token", // Seu JWT
  batchSize: 10,
  flushInterval: 2000,
  labels: { env: "production" },
  dynamicLabels: {
    hostname: () => "api-js-01.local",
  },
});

console.log("Isso será enviado ao Loki!");
trackEvent("usuario_cadastrado", { user_id: 123 });
throw new Error("Erro de teste!"); // Capturado automaticamente

4⚙️ Opções de Configuração

ParâmetroTipoDescriçãoPadrão
urlstringEndpoint do Loki (Push API)
tenantIdstringUsado no header X-Scope-OrgID
appNamestringNome da aplicação (label fixa)
authTokenstringToken JWT para autenticaçãoundefined
batchSizenumberTamanho do buffer antes de forçar envio10
flushIntervalnumber (ms)Tempo máximo antes do envio (ms)2000
labelsRecord<string, string>Labels fixas por log{}
dynamicLabelsRecord<string, () => string>Labels geradas dinamicamente a cada envio{}

5🧪 Exemplo com Express.js

import express from "express";
import { interceptConsole, trackEvent } from "loki-console-logger-js";

interceptConsole({
  url: "https://loki.elvenobservability.com/loki/api/v1/push",
  tenantId: "seu-tenantId",
  authToken: "seu-token",
  appName: "express-app",
  labels: { env: "dev" },
  dynamicLabels: {
    hostname: () => "devbox-js",
  },
});

const app = express();

app.get("/ping", (req, res) => {
  console.log("ping chamado");
  trackEvent("ping");
  res.send({ message: "pong" });
});

app.get("/erro", () => {
  throw new Error("Erro proposital");
});

app.listen(3000, () => {
  console.log("Servidor iniciado na porta 3000");
});

6💡 Boas Práticas

SituaçãoRecomendações
Scripts curtos (CLI, cron)Prefira process.exit() no final, já que o envio é forçado via process.on
Apps web ou workersA configuração padrão já garante envio em background
Ambientes com alta concorrênciaUse batchSize alto (20+) e ajuste flushInterval para evitar sobrecarga
Ambientes com OpenTelemetryLabels trace_id e span_id são capturados automaticamente

7🧯 Troubleshooting

ProblemaCausa comumSolução
Logs não aparecem no LokitenantId, authToken ou labels erradosVerifique headers e use trackEvent() para testar
Logs incompletosProcesso encerrando rápido demaisUse process.exit() ou aguarde flush automático
Falha no envioLoki indisponível ou token inválidoVerifique a URL e o token JWT

8🔄 Flush manual (opcional)

Atualmente o envio é automático com flush no exit, SIGINT, uncaughtException, etc.

Mas se quiser forçar o envio manual:

import { flushLogs } from "loki-console-logger-js";

flushLogs(); // Envia os logs imediatamente

9📤 Eventos customizados

trackEvent("usuario_ativo", {
  user_id: "abc123",
  source: "mobile",
});

No Loki aparecerá como:

[EVENT] usuario_ativo {"user_id": "abc123", "source": "mobile"}

10📁 Formato dos Logs no Loki

Cada log enviado inclui:

  • Timestamp com nanossegundos
  • Labels fixas e dinâmicas (ex: app, env, trace_id)
  • Prefixo do tipo de log ([LOG], [ERROR], [EVENT], etc)
  • Conteúdo serializado se necessário (objetos, erros)

11📄 Licença

Este projeto é licenciado sob a MIT License.


12🙌 Contribuindo

  • Fork este repositório
  • Crie uma branch com sua melhoria
  • Envie um Pull Request Toda ajuda é bem-vinda para tornar o logger JS ainda mais poderoso!

13 🧠 Integração com OpenTelemetry

Este logger se integra automaticamente com o OpenTelemetry, capturando os IDs de trace e span ativos no contexto atual.

Isso permite correlação perfeita entre logs e traces no Grafana Tempo, permitindo investigações completas ponta a ponta.

🔗 O que já está incluso:

  • trace_id e span_id são adicionados automaticamente como labels dinâmicas
  • Nenhuma configuração extra é necessária, desde que o app já use o OpenTelemetry

🧪 Exemplo com traces

import { context, trace } from "@opentelemetry/api";
import { interceptConsole } from "loki-console-logger-js";

// Inicialize o OpenTelemetry antes:
const tracer = trace.getTracer("minha-lib");

interceptConsole({
  url: "<https://loki.elvenobservability.com/loki/api/v1/push>",
  tenantId: "elven",
  appName: "meu-app",
  labels: { env: "prod" },
});

tracer.startActiveSpan("processarPedido", (span) => {
  console.log("Processando pedido");
  span.end();
});

📈 No Loki:

Cada log conterá automaticamente:

{trace_id="abcdef123", span_id="12345678", ...}

Você poderá fazer queries no Loki filtrando por trace_id e, com isso, visualizar os logs do mesmo trace mostrado no Grafana Tempo (ou trace view da Elven Platform).


14 💚 Feito com amor pela Elven Observability

Dúvidas ou sugestões? Fale com a gente!

Nesta página
Rolar para cima