Adapters

Overview

Send your logs to external services with evlog adapters.

Adapters let you send logs to external observability platforms. evlog provides built-in adapters for popular services, and you can create custom adapters for any destination.

How Adapters Work

Adapters hook into the evlog:drain event, which fires after each request completes. The drain runs in fire-and-forget mode, meaning it never blocks the HTTP response.

server/plugins/evlog-drain.ts
import { createAxiomDrain } from 'evlog/axiom'

export default defineNitroPlugin((nitroApp) => {
  nitroApp.hooks.hook('evlog:drain', createAxiomDrain())
})

Available Adapters

Axiom

Send logs to Axiom for powerful querying and dashboards.

OTLP

OpenTelemetry Protocol for Grafana, Datadog, Honeycomb, and more.

Custom

Build your own adapter for any destination.

Multiple Destinations

Send logs to multiple services simultaneously:

server/plugins/evlog-drain.ts
import { createAxiomDrain } from 'evlog/axiom'
import { createOTLPDrain } from 'evlog/otlp'

export default defineNitroPlugin((nitroApp) => {
  const axiom = createAxiomDrain()
  const otlp = createOTLPDrain()

  nitroApp.hooks.hook('evlog:drain', async (ctx) => {
    await Promise.allSettled([axiom(ctx), otlp(ctx)])
  })
})

Drain Context

Every adapter receives a DrainContext with:

FieldTypeDescription
eventWideEventThe complete log event with all accumulated context
requestobjectRequest metadata (method, path, requestId)
headersobjectSafe HTTP headers (sensitive headers are filtered)
Security: Sensitive headers (authorization, cookie, x-api-key, etc.) are automatically filtered and never passed to adapters.

Zero-Config Setup

All adapters support automatic configuration via environment variables. No code changes needed when deploying to different environments:

.env
# Axiom
NUXT_AXIOM_TOKEN=xaat-xxx
NUXT_AXIOM_DATASET=my-logs

# OTLP
NUXT_OTLP_ENDPOINT=https://otlp.example.com
server/plugins/evlog-drain.ts
import { createAxiomDrain } from 'evlog/axiom'

export default defineNitroPlugin((nitroApp) => {
  // Automatically reads from env vars
  nitroApp.hooks.hook('evlog:drain', createAxiomDrain())
})
Copyright © 2026