---
title: "Framework Integrations"
description: "Choose an evlog integration for Nuxt, Next.js, SvelteKit, Hono, Express, or another listed framework. Follow its setup and request-logger access guide."
canonical_url: "https://www.evlog.dev/integrate/frameworks/overview"
---
# Framework Integrations

> Choose an evlog integration for Nuxt, Next.js, SvelteKit, Hono, Express, or another listed framework. Follow its setup and request-logger access guide.

Choose your framework from the table below. `log.set()`, `createError()` and `parseError()` use the same core APIs, while initialization and request-logger access depend on the integration. Some stacks have a module or middleware, others need the manual setup shown in their guide.

Every framework reads its options from one [`evlog.config.ts`](https://www.evlog.dev/reference/configuration). Nuxt, Nitro and TanStack Start load it for you; other frameworks import it.

<callout color="neutral" icon="i-lucide-globe">

No HTTP framework? Use [Standalone TypeScript](https://www.evlog.dev/integrate/frameworks/standalone) for scripts, libraries, and workers, and [Cloudflare Workers](https://www.evlog.dev/integrate/frameworks/cloudflare-workers) on the edge.

</callout>

## Pick your framework

<table>
<thead>
  <tr>
    <th>
      Framework
    </th>
    
    <th>
      Import
    </th>
    
    <th>
      Type
    </th>
    
    <th>
      Logger Access
    </th>
    
    <th>
      Status
    </th>
  </tr>
</thead>

<tbody>
  <tr>
    <td>
      <a href="https://www.evlog.dev/integrate/frameworks/nuxt">
        Nuxt
      </a>
    </td>
    
    <td>
      <code>
        evlog/nuxt
      </code>
    </td>
    
    <td>
      Module
    </td>
    
    <td>
      <code>
        useLogger(event)
      </code>
    </td>
    
    <td>
      Stable
    </td>
  </tr>
  
  <tr>
    <td>
      <a href="https://www.evlog.dev/integrate/frameworks/nextjs">
        Next.js
      </a>
    </td>
    
    <td>
      <code>
        evlog/next
      </code>
    </td>
    
    <td>
      Factory
    </td>
    
    <td>
      <code>
        useLogger()
      </code>
    </td>
    
    <td>
      Stable
    </td>
  </tr>
  
  <tr>
    <td>
      <a href="https://www.evlog.dev/integrate/frameworks/sveltekit">
        SvelteKit
      </a>
    </td>
    
    <td>
      <code>
        evlog/sveltekit
      </code>
    </td>
    
    <td>
      Hooks
    </td>
    
    <td>
      <code>
        event.locals.log
      </code>
      
       / <code>
        useLogger()
      </code>
    </td>
    
    <td>
      Stable
    </td>
  </tr>
  
  <tr>
    <td>
      <a href="https://www.evlog.dev/integrate/frameworks/nitro">
        Nitro
      </a>
    </td>
    
    <td>
      <code>
        evlog/nitro
      </code>
    </td>
    
    <td>
      Module
    </td>
    
    <td>
      <code>
        useLogger(event)
      </code>
    </td>
    
    <td>
      Stable
    </td>
  </tr>
  
  <tr>
    <td>
      <a href="https://www.evlog.dev/integrate/frameworks/tanstack-start">
        TanStack Start
      </a>
    </td>
    
    <td>
      <code>
        evlog/nitro/v3
      </code>
    </td>
    
    <td>
      Module
    </td>
    
    <td>
      <code>
        useRequest().context.log
      </code>
    </td>
    
    <td>
      Stable
    </td>
  </tr>
  
  <tr>
    <td>
      <a href="https://www.evlog.dev/integrate/frameworks/tanstack-start">
        TanStack Router
      </a>
    </td>
    
    <td>
      <code>
        evlog/nitro/v3
      </code>
    </td>
    
    <td>
      Module
    </td>
    
    <td>
      Via TanStack Start (uses Nitro v3)
    </td>
    
    <td>
      Stable
    </td>
  </tr>
  
  <tr>
    <td>
      <a href="https://www.evlog.dev/integrate/frameworks/react-router">
        React Router
      </a>
    </td>
    
    <td>
      <code>
        evlog/react-router
      </code>
    </td>
    
    <td>
      Middleware
    </td>
    
    <td>
      <code>
        context.get(loggerContext)
      </code>
      
       / <code>
        useLogger()
      </code>
    </td>
    
    <td>
      Stable
    </td>
  </tr>
  
  <tr>
    <td>
      <a href="https://www.evlog.dev/integrate/frameworks/nestjs">
        NestJS
      </a>
    </td>
    
    <td>
      <code>
        evlog/nestjs
      </code>
    </td>
    
    <td>
      Module
    </td>
    
    <td>
      <code>
        useLogger()
      </code>
    </td>
    
    <td>
      Stable
    </td>
  </tr>
  
  <tr>
    <td>
      <a href="https://www.evlog.dev/integrate/frameworks/express">
        Express
      </a>
    </td>
    
    <td>
      <code>
        evlog/express
      </code>
    </td>
    
    <td>
      Middleware
    </td>
    
    <td>
      <code>
        req.log
      </code>
      
       / <code>
        useLogger()
      </code>
    </td>
    
    <td>
      Stable
    </td>
  </tr>
  
  <tr>
    <td>
      <a href="https://www.evlog.dev/integrate/frameworks/hono">
        Hono
      </a>
    </td>
    
    <td>
      <code>
        evlog/hono
      </code>
    </td>
    
    <td>
      Middleware
    </td>
    
    <td>
      <code>
        c.get('log')
      </code>
      
       / <code>
        useLogger()
      </code>
    </td>
    
    <td>
      Stable
    </td>
  </tr>
  
  <tr>
    <td>
      <a href="https://www.evlog.dev/integrate/frameworks/fastify">
        Fastify
      </a>
    </td>
    
    <td>
      <code>
        evlog/fastify
      </code>
    </td>
    
    <td>
      Plugin
    </td>
    
    <td>
      <code>
        request.log
      </code>
      
       / <code>
        useLogger()
      </code>
    </td>
    
    <td>
      Stable
    </td>
  </tr>
  
  <tr>
    <td>
      <a href="https://www.evlog.dev/integrate/frameworks/elysia">
        Elysia
      </a>
    </td>
    
    <td>
      <code>
        evlog/elysia
      </code>
    </td>
    
    <td>
      Plugin
    </td>
    
    <td>
      <code>
        log
      </code>
      
       (context) / <code>
        useLogger()
      </code>
    </td>
    
    <td>
      Stable
    </td>
  </tr>
  
  <tr>
    <td>
      <a href="https://www.evlog.dev/integrate/frameworks/orpc">
        oRPC
      </a>
    </td>
    
    <td>
      <code>
        evlog/orpc
      </code>
    </td>
    
    <td>
      Handler wrapper + middleware
    </td>
    
    <td>
      <code>
        context.log
      </code>
      
       / <code>
        useLogger()
      </code>
    </td>
    
    <td>
      Stable
    </td>
  </tr>
  
  <tr>
    <td>
      <a href="https://www.evlog.dev/integrate/frameworks/effect">
        Effect
      </a>
    </td>
    
    <td>
      <code>
        evlog/effect
      </code>
    </td>
    
    <td>
      Layer
    </td>
    
    <td>
      <code>
        yield* EvlogLogger
      </code>
      
       / <code>
        yield* useLogger<T>()
      </code>
    </td>
    
    <td>
      Beta
    </td>
  </tr>
  
  <tr>
    <td>
      <a href="https://www.evlog.dev/integrate/frameworks/cloudflare-workers">
        Cloudflare Workers
      </a>
    </td>
    
    <td>
      <code>
        evlog/workers
      </code>
    </td>
    
    <td>
      Factory
    </td>
    
    <td>
      <code>
        createWorkersLogger()
      </code>
    </td>
    
    <td>
      Stable
    </td>
  </tr>
  
  <tr>
    <td>
      <a href="https://www.evlog.dev/integrate/frameworks/aws-lambda">
        AWS Lambda
      </a>
    </td>
    
    <td>
      <code>
        evlog
      </code>
    </td>
    
    <td>
      Manual
    </td>
    
    <td>
      <code>
        createLogger()
      </code>
      
       / <code>
        createRequestLogger()
      </code>
    </td>
    
    <td>
      Guide
    </td>
  </tr>
  
  <tr>
    <td>
      <a href="https://www.evlog.dev/integrate/frameworks/standalone">
        Standalone
      </a>
    </td>
    
    <td>
      <code>
        evlog
      </code>
    </td>
    
    <td>
      Manual
    </td>
    
    <td>
      <code>
        createLogger()
      </code>
      
       / <code>
        createRequestLogger()
      </code>
    </td>
    
    <td>
      Stable
    </td>
  </tr>
  
  <tr>
    <td>
      <a href="https://www.evlog.dev/integrate/frameworks/astro">
        Astro
      </a>
    </td>
    
    <td>
      <code>
        evlog
      </code>
    </td>
    
    <td>
      Manual
    </td>
    
    <td>
      <code>
        createRequestLogger()
      </code>
    </td>
    
    <td>
      Guide
    </td>
  </tr>
  
  <tr>
    <td>
      <a href="https://www.evlog.dev/extend/custom-framework">
        Custom
      </a>
    </td>
    
    <td>
      <code>
        evlog/toolkit
      </code>
    </td>
    
    <td>
      Build your own
    </td>
    
    <td>
      <code>
        createMiddlewareLogger()
      </code>
    </td>
    
    <td>
      Beta
    </td>
  </tr>
</tbody>
</table>

## What differs from one framework to the next

Two things differ per framework: how you start evlog, and how a handler reaches the request logger.

### Start evlog

<table>
<thead>
  <tr>
    <th>
      Pattern
    </th>
    
    <th>
      Frameworks
    </th>
  </tr>
</thead>

<tbody>
  <tr>
    <td>
      <code>
        evlog(options)
      </code>
      
       middleware / plugin
    </td>
    
    <td>
      Hono, Express, Fastify, Elysia, SvelteKit, React Router
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        createEvlog(options)
      </code>
      
       factory
    </td>
    
    <td>
      Next.js
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        EvlogModule.forRoot()
      </code>
    </td>
    
    <td>
      NestJS
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        routerLayer(options)
      </code>
      
       layer
    </td>
    
    <td>
      Effect
    </td>
  </tr>
  
  <tr>
    <td>
      Module default export
    </td>
    
    <td>
      Nuxt, Nitro v2/v3
    </td>
  </tr>
  
  <tr>
    <td>
      Manual factory
    </td>
    
    <td>
      Cloudflare Workers (<code>
        createWorkersLogger
      </code>
      
      ), Standalone, AWS Lambda, Astro
    </td>
  </tr>
</tbody>
</table>

### Reach the logger from a handler

<table>
<thead>
  <tr>
    <th>
      Pattern
    </th>
    
    <th>
      Frameworks
    </th>
  </tr>
</thead>

<tbody>
  <tr>
    <td>
      <code>
        useLogger(event)
      </code>
    </td>
    
    <td>
      Nuxt, Nitro
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        useLogger()
      </code>
    </td>
    
    <td>
      Next.js, NestJS, Express, Fastify, Elysia, SvelteKit, React Router, Hono
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        c.get('log')
      </code>
    </td>
    
    <td>
      Hono
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        req.log
      </code>
    </td>
    
    <td>
      Express
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        request.log
      </code>
    </td>
    
    <td>
      Fastify
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        event.locals.log
      </code>
    </td>
    
    <td>
      SvelteKit
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        context.get(loggerContext)
      </code>
    </td>
    
    <td>
      React Router
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        yield* EvlogLogger
      </code>
      
       / <code>
        yield* useLogger<T>()
      </code>
    </td>
    
    <td>
      Effect
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        createRequestLogger()
      </code>
      
       / <code>
        createLogger()
      </code>
    </td>
    
    <td>
      Standalone, Workers, manual setups
    </td>
  </tr>
</tbody>
</table>

<callout color="info" icon="i-lucide-info">

On Hono, use `c.get('log')` inside handlers and `useLogger()` from `evlog/hono` in the layers underneath. See [Hono integration](https://www.evlog.dev/integrate/frameworks/hono).

</callout>

## Full-stack frameworks

<card-group>
<card color="neutral" icon="i-simple-icons-nuxtdotjs" title="Nuxt" to="https://www.evlog.dev/integrate/frameworks/nuxt">

Register `evlog/nuxt` in your modules to get auto-imported `useLogger`, `createError`, and `parseError`.

</card>

<card color="neutral" icon="i-simple-icons-nextdotjs" title="Next.js" to="https://www.evlog.dev/integrate/frameworks/nextjs">

`createEvlog()` factory with `withEvlog()` handler wrapper and client provider.

</card>

<card color="neutral" icon="i-simple-icons-svelte" title="SvelteKit" to="https://www.evlog.dev/integrate/frameworks/sveltekit">

Handle and handleError hooks with request-scoped logger on `event.locals.log`.

</card>

<card color="neutral" icon="i-custom-nitro" title="Nitro" to="https://www.evlog.dev/integrate/frameworks/nitro">

Module for both Nitro v2 and v3 with plugin-based drain and enrichment hooks.

</card>

<card color="neutral" icon="i-custom-tanstack" title="TanStack Start" to="https://www.evlog.dev/integrate/frameworks/tanstack-start">

Uses Nitro v3 module with async context, so `useLogger()` works inside server functions. Also covers TanStack Router (full-stack mode).

</card>

<card color="neutral" icon="i-custom-reactrouter" title="React Router" to="https://www.evlog.dev/integrate/frameworks/react-router">

Middleware with `context.get(loggerContext)` and `useLogger()` for loaders and services.

</card>

<card color="neutral" icon="i-simple-icons-nestjs" title="NestJS" to="https://www.evlog.dev/integrate/frameworks/nestjs">

`EvlogModule.forRoot()` with global middleware, exception filter, and async config.

</card>
</card-group>

## Server frameworks

<card-group>
<card color="neutral" icon="i-simple-icons-express" title="Express" to="https://www.evlog.dev/integrate/frameworks/express">

Middleware with `req.log` and 4-argument error handler.

</card>

<card color="neutral" icon="i-simple-icons-hono" title="Hono" to="https://www.evlog.dev/integrate/frameworks/hono">

Middleware with typed `c.get('log')` via `EvlogVariables`.

</card>

<card color="neutral" icon="i-simple-icons-fastify" title="Fastify" to="https://www.evlog.dev/integrate/frameworks/fastify">

Plugin with `request.log` that shadows Fastify's built-in pino logger.

</card>

<card color="neutral" icon="i-custom-elysia" title="Elysia" to="https://www.evlog.dev/integrate/frameworks/elysia">

Plugin with `log` in route context via Elysia's `derive`.

</card>

<card color="neutral" icon="i-lucide-network" title="oRPC" to="https://www.evlog.dev/integrate/frameworks/orpc">

Handler wrapper + procedure middleware exposing `context.log` and per-procedure `operation`.

</card>

<card color="neutral" icon="i-simple-icons-effect" title="Effect" to="https://www.evlog.dev/integrate/frameworks/effect">

Beta. `routerLayer` for `HttpRouter` and `HttpApi`, `EvlogLogger` in the Effect context, and `withLogger` for jobs and alarms.

</card>

<card color="neutral" icon="i-simple-icons-cloudflare" title="Cloudflare Workers" to="https://www.evlog.dev/integrate/frameworks/cloudflare-workers">

Factory for creating request-scoped loggers with Cloudflare-specific context.

</card>

<card color="neutral" icon="i-custom-lambda" title="AWS Lambda" to="https://www.evlog.dev/integrate/frameworks/aws-lambda">

`initLogger` once per runtime; `createLogger` per invocation (SQS, events, HTTP API).

</card>

<card color="neutral" icon="i-simple-icons-typescript" title="Standalone" to="https://www.evlog.dev/integrate/frameworks/standalone">

For scripts, CLI tools, queues, and any TypeScript process.

</card>

<card color="neutral" icon="i-lucide-puzzle" title="Custom Integration" to="https://www.evlog.dev/extend/custom-framework">

Build your own middleware with the evlog toolkit API.

</card>
</card-group>

<callout color="info" icon="i-lucide-info">

All frameworks support the same features: [wide events](https://www.evlog.dev/learn/wide-events), [structured errors](https://www.evlog.dev/learn/structured-errors), [drain adapters](https://www.evlog.dev/integrate/adapters/overview), [enrichers](https://www.evlog.dev/use-cases/enrichers), [sampling](https://www.evlog.dev/learn/sampling), and [AI SDK integration](https://www.evlog.dev/use-cases/ai-sdk/overview).

</callout>

## Strip client logs at build time

For any Vite-based project, the [`evlog/vite` plugin](https://www.evlog.dev/reference/vite-plugin) adds build-time optimizations:

- **Auto-initialization**: no `initLogger()` call needed
- **Debug stripping**: `log.debug()` removed from production builds
- **Source location**: inject `__source: 'file:line'` into log calls

It works with SvelteKit, Hono through vite-node, and any Vite-powered setup. Under Nuxt the same three options live on the `evlog/nuxt` module, so the plugin does not need to be added by hand.


## Sitemap

See the full [sitemap](https://www.evlog.dev/sitemap.md) for all pages.
