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
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:
| Field | Type | Description |
|---|---|---|
event | WideEvent | The complete log event with all accumulated context |
request | object | Request metadata (method, path, requestId) |
headers | object | Safe 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())
})