npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2025 – Pkg Stats / Ryan Hefner

@developerzava/structured-logger

v0.1.2

Published

Reusable structured logging toolkit with correlation IDs, Pino dispatching, and automatic file rotation.

Readme

Structured Logger

Reusable structured logging toolkit wrapping Pino with correlation IDs, daily rotation, and human-friendly console output.

Highlights

  • TypeScript-first API with strongly typed LogCategory, LogLevelName, and structured event payloads.
  • Automatically captures the calling function name for richer context in every record.
  • AsyncLocalStorage correlation IDs via withCorrelationId / bindCorrelationId.
  • Pretty, multi-line console JSON (with ANSI colours) and compact, grep-friendly file output.
  • Pino-based dispatcher that fans out to colourised console logs and daily rotating files (with compression and retention).
  • Pluggable dispatchers; ship your own by implementing the LogDispatcher interface.

Installation

npm install @developerzava/structured-logger
# or
yarn add @developerzava/structured-logger

Add Pino if it is not already present:

npm install pino

Quick Start

import { createStructuredLogger, LogCategory, withCorrelationId } from "@developerzava/structured-logger";

const logger = createStructuredLogger("OrderExecutor", {
  defaultDetails: { service: "order-service" },
});

await withCorrelationId(async () => {
  logger.info({
    category: LogCategory.TRADING,
    action: "OrderPlaced",
    message: "Submitted order to exchange",
    details: { symbol: "AAPL", side: "buy", qty: 100 },
  });
});

Log Output

Console output is pretty-printed JSON with colours when TTY is detected. The timestamp is exposed as date, the message as msg, and the caller function is captured automatically when available:

{
  "date": "2024-05-05T12:00:00.000Z",
  "level": "INFO",
  "category": "TRADING",
  "function": "placeOrder",
  "component": "OrderExecutor",
  "action": "OrderPlaced",
  "correlationId": "tx-abc123",
  "msg": "Submitted order to exchange",
  "details": {
    "symbol": "AAPL",
    "side": "buy",
    "qty": 100,
    "service": "order-service"
  }
}

File output stays single-line and compact for grep/rotation-friendly logs:

2024-05-05T12:00:00.000Z  [INFO -  TRADING]  OrderExecutor:  placeOrder OrderPlaced correlationId=tx-abc123 msg="Submitted order to exchange" details={"symbol":"AAPL","side":"buy","qty":100,"service":"order-service"}

Customising Output

  • Override the dispatcher once during startup to tweak destinations:
import { setDispatcher, PinoLogDispatcher } from "@developerzava/structured-logger";

setDispatcher(
  new PinoLogDispatcher({
    logDirectory: "/var/log/trading-bot",
    filenamePrefix: "trader",
    retentionDays: 14,
    compressAfterDays: 2,
    enableConsole: process.env.NODE_ENV !== "production",
  }),
);
  • Implement your own dispatcher by providing { log(level, record), flush() }.

Correlation IDs

Wrap each logical task with withCorrelationId (HTTP request handlers, job runners). If no correlation ID is bound, the logger generates one automatically.

Building Locally

npm install
npm run build

The compiled artefacts live in dist/ and include both ESM and CommonJS entry points plus type declarations.