LogTide
Language
Easy

Node.js SDK Integration

Send structured logs from Node.js applications to LogTide with automatic batching, retries, and console interception.

DSN-based configuration Distributed tracing Breadcrumbs & scopes TypeScript support

The LogTide JavaScript SDK (@logtide/core) provides structured logging with DSN-based configuration, automatic batching, distributed tracing (W3C Trace Context), breadcrumbs, and scopes.

Why use the LogTide JavaScript SDK?

  • DSN-based config: Single connection string for all settings
  • Distributed tracing: W3C Trace Context propagation across services
  • Breadcrumbs: Trail of events leading up to errors
  • Scopes: Per-request context isolation
  • Console interception: Capture console.log() calls automatically
  • TypeScript: Full type definitions included

Prerequisites

  • Node.js 18+ (LTS recommended)
  • npm, yarn, or pnpm
  • LogTide instance with a DSN

Installation

npm install @logtide/core

For framework-specific integration, install the corresponding package instead:

npm install @logtide/express    # Express.js
npm install @logtide/fastify    # Fastify
npm install @logtide/nextjs     # Next.js
npm install @logtide/nuxt       # Nuxt
npm install @logtide/sveltekit  # SvelteKit
npm install @logtide/hono       # Hono
npm install @logtide/angular    # Angular
npm install @logtide/elysia     # Elysia

Quick Start (5 minutes)

Basic Setup

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

hub.init({
  dsn: process.env.LOGTIDE_DSN,
  service: 'api-server',
  environment: process.env.NODE_ENV,
  release: '1.0.0',
});

// Capture logs
hub.captureLog('info', 'Application started', {
  version: '1.0.0',
  environment: process.env.NODE_ENV,
});

// Different log levels
hub.captureLog('debug', 'Debug information');
hub.captureLog('info', 'User logged in', { userId: '123' });
hub.captureLog('warn', 'Rate limit approaching', { current: 90, max: 100 });
hub.captureLog('error', 'Failed to process payment', { orderId: '456' });
hub.captureLog('critical', 'Database connection lost');

// Graceful shutdown - flush remaining logs
process.on('SIGTERM', async () => {
  await hub.close();
  process.exit(0);
});

Environment Variables

Store your DSN in an environment variable:

# .env
LOGTIDE_DSN=https://[email protected]

Configuration Options

hub.init({
  // Required
  dsn: process.env.LOGTIDE_DSN,

  // Recommended
  service: 'api-server',
  environment: process.env.NODE_ENV,
  release: process.env.npm_package_version,

  // Batching (optional)
  batchSize: 100,        // Flush after N logs (default: 100)
  flushInterval: 5000,   // Flush every N ms (default: 5000)

  // Reliability (optional)
  maxRetries: 3,
  circuitBreakerThreshold: 5,
  circuitBreakerResetMs: 30000,

  // Tracing (optional)
  tracesSampleRate: 1.0,

  // Integrations (optional)
  integrations: [
    new ConsoleIntegration(),
    new GlobalErrorIntegration(),
  ],
});

Express.js Integration

For Express apps, use the dedicated @logtide/express package:

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

const app = express();
app.use(logtide({
  dsn: process.env.LOGTIDE_DSN,
  service: 'api-server',
}));

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

See the Express integration guide for full details.

Fastify Integration

For Fastify apps, use the dedicated @logtide/fastify package:

import Fastify from 'fastify';
import { logtide } from '@logtide/fastify';

const fastify = Fastify();
await fastify.register(logtide, {
  dsn: process.env.LOGTIDE_DSN,
  service: 'api-server',
});

fastify.get('/users/:id', async (request) => {
  request.logtideScope.setTag('userId', request.params.id);
  return { id: request.params.id };
});

See the Fastify integration guide for full details.

Error Capture

try {
  await processPayment(orderId);
} catch (error) {
  hub.captureError(error, {
    extra: { orderId },
    tags: { module: 'payments' },
  });
}

Scopes & Breadcrumbs

// Add breadcrumbs for debugging context
hub.addBreadcrumb({
  category: 'auth',
  message: 'User authenticated',
  level: 'info',
});

// Framework SDKs create per-request scopes automatically.
// For manual scopes:
const client = hub.getClient();
const scope = client.createScope();
scope.setTag('handler', 'payment');
scope.setExtra('userId', 'user-123');
client.captureError(new Error('Payment failed'), {}, scope);

Console Interception

import { hub, ConsoleIntegration } from '@logtide/core';

hub.init({
  dsn: process.env.LOGTIDE_DSN,
  integrations: [
    new ConsoleIntegration(),
  ],
});

// Automatically captured:
console.warn('Disk space low');
console.error('Connection timeout');

Production Best Practices

1. Always Close on Shutdown

const shutdown = async () => {
  await hub.close();
  process.exit(0);
};

process.on('SIGTERM', shutdown);
process.on('SIGINT', shutdown);

2. Set Environment and Release

hub.init({
  dsn: process.env.LOGTIDE_DSN,
  environment: process.env.NODE_ENV,
  release: process.env.npm_package_version,
});

3. Don’t Log Sensitive Data

// Avoid logging sensitive data in metadata
hub.captureLog('info', 'User action', {
  userId: user.id,
  // Don't include: passwords, tokens, credit cards
});

4. Use Appropriate Log Levels

LevelUse Case
debugDetailed debugging info (disabled in production)
infoNormal operations: requests, user actions
warnRecoverable issues: rate limits, retries
errorFailures that need attention
criticalSystem failures requiring immediate action

Performance

MetricValue
Memory overhead~5MB
Latency (batched)<1ms per log
Network calls1 per batch (100 logs default)
CPU impact<0.1%

Framework Packages

PackageFramework
@logtide/expressExpress.js
@logtide/fastifyFastify
@logtide/nextjsNext.js
@logtide/nuxtNuxt
@logtide/sveltekitSvelteKit
@logtide/honoHono
@logtide/angularAngular
@logtide/elysiaElysia

Next Steps