Pino Multi-Transport Log Routing
Route Pino logs to multiple transports in parallel, sending errors to a dedicated sink while pretty console output stays development-only.
Code
import { pino } from 'pino';
const isProd = process.env.NODE_ENV === 'production';
const logger = pino({
level: process.env.LOG_LEVEL ?? 'info',
base: { service: 'billing', region: 'eu-1' },
transports: isProd
? [
{
level: 'info',
target: 'pino/file',
options: { destination: 1, mkdir: false },
},
{
level: 'error',
target: 'pino-elasticsearch',
options: {
node: 'http://elastic:9200',
index: 'billing-errors',
flushInterval: 2000,
},
},
]
: [
{
target: 'pino-pretty',
options: { colorize: true, translateTime: 'SYS:HH:MM:ss' },
},
],
});
logger.info({ invoiceId: 'inv-9', amount: 4200 }, 'invoice settled');
logger.warn({ retries: 2 }, 'settlement retried');
logger.error({ invoiceId: 'inv-10', reason: 'gateway timeout' }, 'settlement failed');
setInterval(() => {
logger.debug('heartbeat');
}, 30_000).unref();Report a problem with this exampleOpens a pre-filled issue on GitHub.