node-red-contrib-elven-logs-interceptor
v1.0.1
Published
Node-RED node for elven-logs-interceptor
Maintainers
Readme
Logs Interceptor (V3)
High-performance log interceptor for Node.js with Loki transport, batching, compression, circuit breaker, and DLQ.
Installation
npm install elven-logs-interceptorQuick Start
import { init, logger } from "elven-logs-interceptor";
init({
appName: "billing-service",
interceptConsole: true,
transport: {
url: process.env.LOGS_URL!,
tenantId: process.env.LOGS_TENANT!,
authToken: process.env.LOGS_TOKEN,
compression: "snappy",
useWorkers: true,
},
});
logger.info("service started", { port: 3000 });Environment Variables (Official)
This version uses LOGS_* variables.
Required
LOGS_URLLOGS_TENANTLOGS_APP_NAME
Core
LOGS_TOKENLOGS_APP_VERSIONLOGS_ENVIRONMENT
Transport
LOGS_COMPRESSION(none|gzip|brotli|snappy)LOGS_COMPRESSION_LEVELLOGS_COMPRESSION_THRESHOLDLOGS_USE_WORKERSLOGS_MAX_WORKERSLOGS_WORKER_TIMEOUTLOGS_CONNECTION_POOLINGLOGS_MAX_SOCKETSLOGS_TIMEOUTLOGS_MAX_RETRIESLOGS_RETRY_DELAY
Buffer
LOGS_BUFFER_MAX_SIZELOGS_BUFFER_FLUSH_INTERVALLOGS_BUFFER_MAX_MEMORY_MBLOGS_BUFFER_MAX_AGELOGS_BUFFER_AUTO_FLUSH
Filter
LOGS_FILTER_LEVELS(debug,info,warn,error,fatal)LOGS_FILTER_SAMPLING_RATELOGS_FILTER_SANITIZELOGS_FILTER_MAX_MESSAGE_LENGTH
Circuit Breaker
LOGS_CIRCUIT_BREAKER_ENABLEDLOGS_CIRCUIT_BREAKER_FAILURE_THRESHOLDLOGS_CIRCUIT_BREAKER_RESET_TIMEOUTLOGS_CIRCUIT_BREAKER_HALF_OPEN_REQUESTS
DLQ
LOGS_DLQ_ENABLEDLOGS_DLQ_TYPE(memory|file)LOGS_DLQ_MAX_SIZELOGS_DLQ_MAX_RETRIESLOGS_DLQ_BASE_PATH
Runtime / Features
LOGS_MAX_CONCURRENT_FLUSHESLOGS_INTERCEPT_CONSOLELOGS_PRESERVE_ORIGINAL_CONSOLELOGS_ENABLE_METRICSLOGS_ENABLE_HEALTH_CHECKLOGS_DEBUGLOGS_SILENT_ERRORSLOGS_ENABLEDLOGS_AUTO_INIT
Labels
Use LOGS_LABEL_* keys.
Example:
LOGS_LABEL_SERVICE=busca-prdLOGS_LABEL_ENVIRONMENT=prd
Auto-Init Behavior
No automatic init by default on import.
- Set
LOGS_AUTO_INIT=trueto enable opt-in auto-init. preload.jssets this automatically.
Preload (Zero-Code)
NODE_OPTIONS="--require elven-logs-interceptor/preload" node app.jsContext Propagation
logger.withContext({ requestId: "req-123" }, () => {
logger.info("inside context");
});
await logger.withContextAsync({ requestId: "req-456" }, async () => {
logger.info("inside async context");
});Integrations
Winston
import winston from "winston";
import { WinstonTransport, getLogger } from "elven-logs-interceptor";
const interceptor = getLogger();
const winstonLogger = winston.createLogger({
transports: [new WinstonTransport({ logger: interceptor })],
});Morgan
import morgan from "morgan";
import { MorganAdapter, getLogger } from "elven-logs-interceptor";
const interceptor = getLogger();
app.use(
morgan("combined", { stream: MorganAdapter.createStream(interceptor) }),
);
// or
app.use(MorganAdapter.create("combined", interceptor));Resilience Model
- Retry for transient failures (
429,5xx, timeouts/network errors) - Circuit breaker with bounded half-open probes
- DLQ with bounded size and
drop-oldestpolicy - Non-blocking behavior for application code paths
License
MIT
