evlog
Use this skill when work touches evlog — wide events, structured errors, drains, sampling, audit trails, AI SDK telemetry, client logging, or @evlog/cli map coverage scoring.
Workflow
- Inspect the local logging surface before changing code:
- Package versions for
evlog, optional@evlog/cli, framework peers, and drain destinations in use. - Integration path: Nuxt/Nitro module, Next
createEvlog/withEvlog, TanStack Startevlog/nitro/v3, Hono/Express/Fastify/Elysia middleware, standaloneinitLogger, Workers, etc. - Patterns: scattered
console/pinolines vslog.setwide events,createError({ why, fix }), audits, AI wraps, client ingest.
- Package versions for
- Refresh docs when versions or APIs are unclear. Start from source-map.md.
- For install, three logging modes,
initLogger, and core APIs, use setup-core.md. - For wide-event design, sealing/
fork, structured errors, catalogs, and redaction, use wide-events-errors.md. - For framework wiring and adapter choice, use frameworks-adapters.md.
- For pipelines, sampling, audit, AI, client logs, and
evlog map/CI, use cli-advanced.md.
Implementation Judgment
- Prefer one wide event per unit of work (
log.setthen auto-emitor manualemit) over many info lines in the same request/job. - Group context into nested objects (
user,cart,payment) with meaningful keys—not flatuserId/cartIdsoup or a genericdatabag. - Use the right mode:
log.*for one-shots;createLogger/createRequestLoggerwhen you own the lifecycle; frameworkuseLogger/req.log/c.get('log')when middleware owns create+emit. - Throw
createError({ message, status, why, fix, link?, code?, internal? })instead of bareError. Parse on clients withparseError. - After emit (or sampled drop), the logger is sealed—post-response
setis ignored. Uselog.fork(where available) for intentional background child events. - Libraries and shared packages: use
createLogger/ accept a logger; do not callinitLoggerand force a drain on the host. - Production: wrap adapters in
createDrainPipeline(batch + retry); enable head+tail sampling; keep errors and money/auth paths. - On Nuxt/Nitro/Next/TanStack Start, run
bunx @evlog/cli map(ornpx @evlog/cli map) before large logging refactors—fix FIX FIRST first. Pin CLI version in CI.
Verification
Prefer the repo's existing checks. For meaningful evlog changes, include the relevant subset:
- Hit a route/job locally and confirm one wide event with expected nested fields (pretty in dev).
- Force a
createErrorpath and confirmwhy/fixin logs and clientparseError. bunx @evlog/cli map/doctorwhen changing entry-point coverage or setup.- Drain smoke (Axiom/Sentry/fs NDJSON) when changing pipelines; flush on shutdown.
- Sampling config check: errors and
keeprules still retained in production-shaped config. - Typecheck for
RequestLogger, typed fields, and catalog imports.