LogTide
Framework
Easy

Express.js Logging Integration

Add structured logging to Express.js applications with automatic request tracing, scoped context, and error capture.

Automatic request logging Per-request scoping W3C trace propagation Error handler middleware

LogTide’s Express SDK provides drop-in middleware for automatic request logging, per-request context scoping, and distributed tracing with W3C Trace Context.

Why use LogTide with Express?

  • Zero-config request logging: Every HTTP request/response logged automatically
  • Per-request scoping: Attach user, tenant, and custom tags to all logs in a request
  • Distributed tracing: W3C traceparent headers propagated automatically
  • Error capture: Unhandled errors captured with full request context
  • Non-blocking: Logging never slows down your request handling

Prerequisites

  • Node.js 18+
  • Express 4.x or 5.x
  • LogTide instance with a DSN

Installation

npm install @logtide/express

This includes @logtide/core as a dependency.

Quick Start

import express from 'express';
import { hub } from '@logtide/core';
import { logtide } from '@logtide/express';

const app = express();

// Add LogTide middleware (initializes LogTide automatically)
app.use(logtide({
  dsn: process.env.LOGTIDE_DSN,
  service: 'api-server',
  environment: process.env.NODE_ENV,
}));

app.get('/users/:id', (req, res) => {
  req.logtideScope.setTag('userId', req.params.id);
  res.json({ id: req.params.id });
});

app.listen(3000);

Middleware Configuration

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

Per-Request Context

Attach context to all logs within a request:

app.use((req, res, next) => {
  if (req.user) {
    req.logtideScope.setExtra('userId', req.user.id);
    req.logtideScope.setExtra('email', req.user.email);
  }
  req.logtideScope.setTag('tenant', req.headers['x-tenant-id']);
  next();
});

Trace Propagation

The middleware extracts incoming traceparent headers and makes the trace ID available:

app.get('/api/data', async (req, res) => {
  // Include trace ID in responses for debugging
  res.set('X-Trace-Id', req.logtideTraceId);
  res.json({ data: [] });
});

Error Handling

// The middleware automatically captures 5xx errors.
// Your error response handler:
app.use((err, req, res, next) => {
  res.status(err.status || 500).json({
    error: err.message,
    traceId: req.logtideTraceId,
  });
});

Request Logging Output

Each request generates a structured log:

{
  "level": "info",
  "message": "GET /users/123 200",
  "service": "api-server",
  "metadata": {
    "method": "GET",
    "path": "/users/123",
    "statusCode": 200,
    "duration": 45,
    "ip": "192.168.1.1",
    "userAgent": "Mozilla/5.0..."
  }
}

Next Steps