How to Add Audit Logs to NestJS

TL;DR: Add Trailbase to your NestJS application using a custom module and interceptor for automatic audit logging across all controllers.

Step 1: Install the SDK

npm install @trailbase/sdk

Step 2: Initialize the Client

// trailbase.module.ts
import { Module, Global } from '@nestjs/common';
import { TrailbaseClient } from '@trailbase/sdk';

@Global()
@Module({
  providers: [
    {
      provide: 'TRAILBASE',
      useFactory: () =>
        new TrailbaseClient({
          apiKey: process.env.TRAILBASE_API_KEY!,
          region: 'us-east-1',
        }),
    },
  ],
  exports: ['TRAILBASE'],
})
export class TrailbaseModule {}

Register TrailbaseModule in your AppModule imports. Use the interceptor for automatic logging or inject TRAILBASE directly into services for manual tracking.

Step 3: Track Audit Events

// audit.interceptor.ts
@Injectable()
export class AuditInterceptor implements NestInterceptor {
  constructor(@Inject('TRAILBASE') private trailbase: TrailbaseClient) {}

  intercept(context: ExecutionContext, next: CallHandler) {
    return next.handle().pipe(
      tap(() => {
        const req = context.switchToHttp().getRequest();
        this.trailbase.track(`${req.method.toLowerCase()}.${req.path}`, {
          actor: req.user?.id,
          metadata: { statusCode: context.switchToHttp().getResponse().statusCode },
        });
      }),
    );
  }
}

// Or use directly in a service
@Injectable()
export class UsersService {
  constructor(@Inject('TRAILBASE') private trailbase: TrailbaseClient) {}

  async updateRole(actorId: string, userId: string, role: string) {
    await this.trailbase.track('user.role.update', {
      actor: actorId,
      target: userId,
      metadata: { newRole: role },
    });
  }
}

Step 4: Query Audit Logs

@Controller('audit')
export class AuditController {
  constructor(@Inject('TRAILBASE') private trailbase: TrailbaseClient) {}

  @Get()
  async search(@Query() query: SearchDto) {
    return this.trailbase.search({
      actor: query.userId,
      from: query.from,
    });
  }
}

Other Integrations

Next.jsTypeScriptExpress.jsJavaScript / TypeScriptFastifyTypeScript

Ready to Add Audit Logs to NestJS?

Join the waitlist for early access. Five-minute setup, no infrastructure changes.

Get Early Access