npm install pino// src/lib/server/logger.ts
import pino from 'pino';
export const logger = pino({
level: process.env.LOG_LEVEL || 'info'
});import { logger } from '$lib/server/logger';
// Instead of console.error('Failed to save match:', err);
logger.error({ err }, 'Failed to save match');
// Instead of console.log('User registered');
logger.info({ userId: user.id }, 'User registered');Pino outputs JSON by default with zero config:
{"level":50,"time":1710268800000,"err":{"message":"...","stack":"..."},"msg":"Failed to save match"}
{"level":30,"time":1710268800000,"userId":"abc123","msg":"User registered"}| Level | Number | Method |
|---|---|---|
| fatal | 60 | logger.fatal() |
| error | 50 | logger.error() |
| warn | 40 | logger.warn() |
| info | 30 | logger.info() |
| debug | 20 | logger.debug() |
| trace | 10 | logger.trace() |
- Set
LOG_LEVEL=debugin dev,LOG_LEVEL=infoin production - Always pass errors as
{ err }— Pino serializes stack traces automatically - Add context as the first argument object:
logger.info({ userId, action }, 'message') - Works great with Dozzle — JSON logs are syntax-highlighted and filterable