Skip to content

Pretty Output ​

Pretty output is a developer-experience layer for local consoles and terminals. It keeps LoggerJS records structured internally, then renders them at the transport boundary for humans.

Use pretty transports for development, demos, local debugging, Storybook, browser DevTools, CLIs, and tests that need readable output. Use structured transports such as stdoutTransport(), fileTransport(), browserHttpTransport(), OTLP, Loki, or Datadog for production delivery.

Browser DevTools ​

Use prettyConsoleTransport() from @loggerjs/pretty when you want readable browser console output with inspectable objects:

ts
import { createLogger } from "@loggerjs/core";
import { prettyConsoleTransport } from "@loggerjs/pretty/transport-console";

const logger = createLogger({
  transports: [
    prettyConsoleTransport({
      browserStyles: "auto",
      mode: "compact",
      includeData: true,
      includeContext: false,
    }),
  ],
});

logger.info("cart updated", { itemCount: 3 });

What it does:

  • Uses %c styles in browsers when browserStyles: "auto" detects DevTools.
  • Passes data, error, and other details as separate console arguments so objects stay expandable.
  • Writes through LoggerJS' unpatched console registry, so it can run beside captureConsoleIntegration() without loops.
  • Filters records captured from captureConsoleIntegration() by default.

Node Terminal ​

Use prettyStdoutTransport() or prettyStderrTransport() for local terminal output:

ts
import { createLogger } from "@loggerjs/core";
import { prettyStdoutTransport } from "@loggerjs/pretty/transport-stream";

const logger = createLogger({
  transports: [
    prettyStdoutTransport({
      colors: "auto",
      mode: "expanded",
      minLevel: "debug",
    }),
  ],
});

What it does:

  • Emits ANSI colors when the target stream is a TTY.
  • Honors NO_COLOR and FORCE_COLOR.
  • Supports minLevel.
  • flush() waits for drain when the stream reports backpressure.
  • Does not end process.stdout / process.stderr on close() unless endOnClose: true is set.

Shared Formatter ​

Custom display transports can use the formatter directly:

ts
import { formatPrettyEvent } from "@loggerjs/pretty/formatter";

const rendered = formatPrettyEvent(event, {
  colors: "never",
  mode: "expanded",
  includeTrace: true,
});

console.log(rendered.text);

formatPrettyEvent() returns:

  • text for plain output.
  • ansiText for terminal output when colors: "always" is used.
  • browserArgs for console.*(...args) with browser %c styles.
  • details with raw values and serialized text for custom sinks.

Option Guidance ​

OptionUse
mode: "compact"One-line local output. Good for browser consoles and busy CLIs.
mode: "expanded"Multi-line output with one detail per line. Good for local Node debugging.
colors: "auto"Terminal default: use ANSI only when the stream looks interactive.
browserStyles: "auto"Browser default: use CSS console styles only in browser-like runtimes.
includeData / includeErrorOn by default because pretty output is for humans.
includeContext / includeTrace / includeSource / includeIdOff by default to keep output readable; enable when debugging correlation.

Production Boundary ​

Pretty transports are intentionally not durability transports. They do not batch, retry, persist, or speak a collector wire protocol. For production Node services, prefer:

ts
import { stdoutTransport } from "@loggerjs/node";

stdoutTransport(); // NDJSON for collectors

For local development, it is normal to run both:

ts
import { createLogger } from "@loggerjs/core";
import { stdoutTransport } from "@loggerjs/node";
import { prettyStderrTransport } from "@loggerjs/pretty";

const logger = createLogger({
  transports: [
    stdoutTransport({ minLevel: "info" }),
    prettyStderrTransport({ minLevel: "debug", colors: "auto" }),
  ],
});

Released under the MIT License.