Logging & Telemetry

stat:* telemetry events, eventLogger (Pino/Winston), and how stats subscribe to the same events.

Keyv emits structured telemetry for reads, writes, deletes, and operation errors, and can pipe events through Hookified's eventLogger (Pino, Winston, or any logger with info / warn / error / …).

Table of Contents

Telemetry events

Emitted as KeyvEvents (see Events and Errors):

Event Payload
stat:hit { event: 'hit', key, namespace, timestamp }
stat:miss { event: 'miss', key, namespace, timestamp }
stat:set { event: 'set', key, namespace, timestamp }
stat:delete { event: 'delete', key, namespace, timestamp }
stat:error { event: 'error', key, namespace, timestamp }

Batch read, write, and delete methods emit one event per key. Successful has() and hasMany() probes do not emit stat:hit or stat:miss; failures still emit stat:error. A read that fails emits stat:error and no stat:miss.

import Keyv, { KeyvEvents } from "keyv";

const keyv = new Keyv();

keyv.on(KeyvEvents.STAT_HIT, (event) => {
	console.log("hit", event.key, event.namespace, event.timestamp);
});

KeyvStats is a ready-made subscriber for these events. See Statistics.

eventLogger

Keyv extends Hookified, so you can attach a logger. Hookified maps event names to log levels:

Emitted name Logger method
error error()
warn warn()
debug debug()
trace trace()
fatal fatal()
anything else (including stat:hit) info()
import pino from "pino";

const keyv = new Keyv();
keyv.eventLogger = pino({ level: "info" });

keyv.on("error", () => {}); // keep empty-listener throws from firing
await keyv.set("foo", "bar");

The constructor does not take eventLogger; set the property after new Keyv().

Remove it with keyv.eventLogger = undefined.

Custom metrics

Subscribe to stat:* yourself to export Prometheus counters, OpenTelemetry spans, or logs without enabling KeyvStats:

keyv.on("stat:hit", ({ key, namespace }) => {
	metrics.increment("cache_hit", { key, namespace });
});
keyv.on("stat:miss", ({ key }) => {
	metrics.increment("cache_miss", { key });
});

Deprecation warnings

Using v5 hook names (preSet, …) emits 'warn' and, if configured, eventLogger.warn(). Prefer KeyvHooks.BEFORE_* / AFTER_*. See Hooks.

Edit this page