LogTide
Framework
Easy

Elysia Framework Logging Integration

Add structured logging to Elysia applications running on Bun with lifecycle hooks, scoped context, and trace propagation.

Bun-optimized Lifecycle hook integration Plugin with .as('global') Trace propagation

LogTide’s Elysia SDK provides a Bun-optimized plugin for automatic request logging, scoped context, lifecycle hooks, and W3C trace propagation.

Why use LogTide with Elysia?

  • Bun-optimized: Takes advantage of Bun’s performance
  • Plugin architecture: Use .as('global') for app-wide coverage
  • Lifecycle hooks: onRequest, afterResponse, onError, onStop
  • Scoped context: Per-request scope via store decorators
  • Auto-shutdown: Flushes pending logs when the server stops

Prerequisites

  • Bun 1.x
  • Elysia 1.x
  • LogTide instance with a DSN

Installation

bun add @logtide/elysia

Quick Start

import { Elysia } from 'elysia';
import { hub } from '@logtide/core';
import { logtide } from '@logtide/elysia';

const app = new Elysia()
  .use(logtide({
    dsn: process.env.LOGTIDE_DSN,
    service: 'elysia-api',
    environment: process.env.NODE_ENV,
  }))
  .get('/users/:id', ({ params }) => {
    hub.captureLog('info', 'Fetching user', { userId: params.id });
    return { id: params.id };
  })
  .listen(3000);

Use .as('global') to apply the plugin to all routes, including those registered after.

Plugin Options

app.use(logtide({
  dsn: process.env.LOGTIDE_DSN,
  service: 'elysia-api',
  environment: process.env.NODE_ENV,
  release: '1.0.0',
  tracesSampleRate: 1.0,
}));

Scoped Context

app
  .use(logtide({
    dsn: process.env.LOGTIDE_DSN,
    service: 'elysia-api',
  }))
  .get('/orders', () => {
    hub.captureLog('info', 'Listing orders');
    return { orders: [] };
  });

Lifecycle Hooks

HookBehavior
onRequestCreates scope, extracts traceparent, starts span
afterResponseLogs completion with duration
onErrorCaptures errors with request context
onStopFlushes pending events

Error Handling

app
  .use(logtide({
    dsn: process.env.LOGTIDE_DSN,
    service: 'elysia-api',
  }))
  .onError(({ code, error }) => {
    // Error is already captured by the plugin
    return new Response(JSON.stringify({
      error: error.message,
    }), {
      status: code === 'NOT_FOUND' ? 404 : 500,
    });
  });

Next Steps