OCPP WS IOOCPP WS IO
VoltLog IO

Transports

Send your logs to files, databases, or external services.

Transports are the destination for your logs. You can use multiple transports simultaneously.

📦 Core Transports

Console

Writes logs to stdout/stderr as JSON.

import { createLogger, consoleTransport } from "ocpp-ws-io/logger";

const logger = createLogger({
  transports: [
    consoleTransport({
      level: "INFO", // Independent level filter
    }),
  ],
});

File (Server-Only)

Writes logs to rotating files on disk.

import { createLogger, fileTransport } from "ocpp-ws-io/logger";
import { join } from "path";

const logger = createLogger({
  transports: [
    fileTransport({
      dir: join(process.cwd(), "logs"),
      filename: "app-%DATE%.log", // Rotates daily
    }),
  ],
});

Pretty (Dev-Only)

Formats logs for human readability.

import { createLogger, prettyTransport } from "ocpp-ws-io/logger";

const logger = createLogger({
  transports: [
    prettyTransport({
      colors: true,
      timestamps: true,
    }),
  ],
});

🌐 Streaming

JSON Stream

Writes NDJSON (Newline Delimited JSON) to any Node.js WritableStream.

import { createWriteStream } from "fs";
import { createLogger, jsonStreamTransport } from "ocpp-ws-io/logger";

const stream = createWriteStream("output.log");
const logger = createLogger({
  transports: [jsonStreamTransport({ stream })],
});

Browser JSON Stream

Writes NDJSON to a WHATWG WritableStream (for Browsers/Edge).

import { createLogger, browserJsonStreamTransport } from "ocpp-ws-io/logger";

// Example: Streaming to a Service Worker
const stream = new WritableStream({ ... });
const logger = createLogger({
  transports: [
    browserJsonStreamTransport({ stream }),
  ],
});

🔌 Integrations

Redis Streams

Publishes logs to a Redis Stream using ioredis.

import Redis from "ioredis";
import { createLogger, redisTransport } from "ocpp-ws-io/logger";

const redis = new Redis();
const logger = createLogger({
  transports: [
    redisTransport({
      client: redis,
      streamKey: "logs:app",
      maxLen: 10000, // Capped stream size
    }),
  ],
});

Datadog

Sends logs directly to Datadog via their HTTP Intake API.

import { createLogger, datadogTransport } from "ocpp-ws-io/logger";

const logger = createLogger({
  transports: [
    datadogTransport({
      apiKey: process.env.DD_API_KEY!,
      service: "my-app",
      ddSource: "nodejs",
      tags: "env:prod,region:us-east",
    }),
  ],
});

Loki (Grafana)

Pushes logs to Grafana Loki.

import { createLogger, lokiTransport } from "ocpp-ws-io/logger";

const logger = createLogger({
  transports: [
    lokiTransport({
      host: "http://loki:3100",
      labels: { app: "backend" },
      batchSize: 10,
    }),
  ],
});

Sentry

Captures Errors as Exceptions and other logs as Breadcrumbs.

import * as Sentry from "@sentry/node";
import { createLogger, sentryTransport } from "ocpp-ws-io/logger";

// Initialize Sentry first
Sentry.init({ dsn: "..." });

const logger = createLogger({
  transports: [
    sentryTransport({
      sentry: Sentry,
      errorLevel: "ERROR", // Send ERRORs as captured exceptions
      breadcrumbLevel: "INFO", // Send INFO+ as breadcrumbs
    }),
  ],
});

Slack / Discord

Sends notifications to chat channels. Best used with a high-level filter (ERROR only).

import {
  createLogger,
  slackTransport,
  discordTransport,
} from "ocpp-ws-io/logger";

const logger = createLogger({
  transports: [
    slackTransport({
      webhookUrl: process.env.SLACK_WEBHOOK_URL!,
      level: "FATAL", // Only wake me up for fatal errors
    }),
    discordTransport({
      webhookUrl: process.env.DISCORD_WEBHOOK_URL!,
      level: "ERROR",
    }),
  ],
});

Webhook (Generic)

POSTs logs to any HTTP endpoint.

import { createLogger, webhookTransport } from "ocpp-ws-io/logger";

const logger = createLogger({
  transports: [
    webhookTransport({
      url: "https://my-log-aggregator.com/ingest",
      headers: { Authorization: "Bearer ..." },
    }),
  ],
});

⚙️ Utilities

Batch Transport (Performance)

Wraps any other transport to buffer logs and send them in chunks. Highly recommended for HTTP/Network transports.

import {
  createLogger,
  batchTransport,
  webhookTransport,
} from "ocpp-ws-io/logger";

const logger = createLogger({
  transports: [
    batchTransport(webhookTransport({ url: "..." }), {
      batchSize: 100, // Wait for 100 logs
      flushIntervalMs: 2000, // Or 2 seconds
    }),
  ],
});

Custom Transport

You can create a custom transport without implementing the full interface by using the createTransport helper.

import { createTransport } from "ocpp-ws-io/logger";

const myTransport = createTransport("my-custom-transport", async (entry) => {
  console.log("Custom log:", entry.message);
  // Send entry to external service...
});

const logger = createLogger({
  transports: [myTransport],
});

On this page