โ† Back to Home

Framework Integrations

Official integrations for every major framework. Auto-instrument your app with zero configuration.

All Supported Frameworks

Express Node.js

Middleware for request logging, error handling, and request IDs.

Fastify Node.js

Plugin for auto-logging requests and responses with hooks.

Koa Node.js

Middleware for request/response logging with error handling.

Hono Edge

Middleware for edge runtimes with request tracking.

NestJS Node.js

Module, interceptor, exception filter, and injectable logger.

Next.js React

Plugin for API routes and server components instrumentation.

React Frontend

Hooks for component lifecycle and async operations.

Angular Frontend

Service, HTTP interceptor, and global error handler.

Vue Frontend

Plugin, composable, and Vue 2 compatible support.

Svelte Frontend

Function for component logging and async tracking.

SvelteKit Full-stack

Server hook and logger for routes and API endpoints.

Astro Static

Integration for build and dev server logging.

CLI Node.js

Command tracking, progress bars, and tables.

๐ŸŸข Express.js

const { betterLogger, betterErrorHandler } = require('@better-logger/express')

const app = express()
app.use(betterLogger({ logBody: false, redactFields: ['password'] }))
app.use(betterErrorHandler)

๐ŸŸฃ Fastify

const fastify = require('fastify')()
await fastify.register(require('@better-logger/fastify'))

๐Ÿ”ด Koa

const Koa = require('koa')
const { betterLogger, betterErrorHandler } = require('@better-logger/koa')

const app = new Koa()
app.use(betterLogger())
app.on('error', betterErrorHandler)

๐Ÿ”ต Hono

import { Hono } from 'hono'
import { betterLogger, betterErrorHandler } from '@better-logger/hono'

const app = new Hono()
app.use('*', betterLogger())
app.onError(betterErrorHandler)

๐Ÿ”ด NestJS

import { BetterLoggerModule, BetterLoggerInterceptor } from '@better-logger/nestjs'

@Module({
  imports: [BetterLoggerModule.forRoot({ redactFields: ['password'] })],
  providers: [{
    provide: APP_INTERCEPTOR,
    useClass: BetterLoggerInterceptor
  }]
})
export class AppModule {}

โ–ฒ Next.js

// next.config.js
const withBetter = require('@better-logger/nextjs')
module.exports = withBetter({ /* config */ })

// pages/api/users.js
import { withBetterLoggerAPI } from '@better-logger/nextjs'
export default withBetterLoggerAPI(async (req, res) => { ... })

โš›๏ธ React

import { useComponentLogger, useAsyncLogger, BetterErrorBoundary } from '@better-logger/react'

function UserProfile({ userId }) {
  const logger = useComponentLogger('UserProfile')
  const fetchData = useAsyncLogger('fetch-user')

  useEffect(() => {
    logger.mount({ userId })
    return () => logger.unmount({ userId })
  }, [userId])
}

๐Ÿ…ฐ๏ธ Angular

import { BetterLoggerModule } from '@better-logger/angular'

@NgModule({
  imports: [BetterLoggerModule.forRoot({ redactFields: ['password'] })],
  providers: [{ provide: ErrorHandler, useClass: BetterLoggerErrorHandler }]
})
export class AppModule {}

// component.ts
constructor(private logger: BetterLoggerService) {}
this.logger.log('Component initialized')

๐Ÿ’š Vue

import { BetterLoggerPlugin } from '@better-logger/vue'

const app = createApp(App)
app.use(BetterLoggerPlugin, { redactFields: ['password'] })

// component.vue
import { useLogger } from '@better-logger/vue'
const logger = useLogger('MyComponent')
logger.log('Component mounted')

๐ŸŸ  Svelte

<script>
import { useLogger, track } from '@better-logger/svelte'
const logger = useLogger('MyComponent')

const data = await track('fetch-data', () => fetch('/api/data'))
logger.log('Data loaded', { count: data.length })
</script>

๐ŸŸก SvelteKit

// hooks.server.js
import { betterLogger, serverLogger } from '@better-logger/sveltekit'
export const handle = betterLogger()

// +page.server.js
const logger = serverLogger('load')
export async function load() {
  logger.log('Page loaded')
}

๐Ÿš€ Astro

// astro.config.mjs
import { defineConfig } from 'astro/config'
import betterLogger from '@better-logger/astro'

export default defineConfig({
  integrations: [betterLogger({ redactFields: ['password'] })]
})

๐Ÿ’ป CLI Tools

const { command, step, progress, table } = require('@better-logger/cli')

await command('build', async () => {
  await step('compile', async () => { /* ... */ })
  progress(50, 100, 'bundling...')
})

Core vs Package: When to use what?

You can always use @better-logger/core directly in any framework. Framework packages are for zero-config auto-instrumentation.

ScenarioUse CoreUse Package
Simple app Perfect. Just better.log() calls. Not needed.
Auto-request logging Write manual middleware. โœ… One line: app.use(betterLogger()).
Error handling Manual try/catch blocks. โœ… Built-in error handler integration.
Component lifecycle Manual useEffect calls. โœ… Hooks like useComponentLogger().
HTTP Interception Manual fetch/axios wrappers. โœ… Auto-interceptor (Angular/NestJS).
Server Components Manual flow creation. โœ… Plugin handles Next.js/Astro routing.

Complete Package List

PackageFrameworkInstall
@better-logger/expressExpress.jsnpm i @better-logger/express
@better-logger/fastifyFastifynpm i @better-logger/fastify
@better-logger/koaKoanpm i @better-logger/koa
@better-logger/honoHononpm i @better-logger/hono
@better-logger/nestjsNestJSnpm i @better-logger/nestjs
@better-logger/nextjsNext.jsnpm i @better-logger/nextjs
@better-logger/reactReactnpm i @better-logger/react
@better-logger/angularAngularnpm i @better-logger/angular
@better-logger/vueVue 2/3npm i @better-logger/vue
@better-logger/svelteSveltenpm i @better-logger/svelte
@better-logger/sveltekitSvelteKitnpm i @better-logger/sveltekit
@better-logger/astroAstronpm i @better-logger/astro
@better-logger/cliCLInpm i @better-logger/cli