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.

TypescriptNodeResilience

Code

snippet
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();