Winston Elasticsearch Transport Indexing

Ship Winston logs to Elasticsearch with bulk indexing, retry on rejection, and index rotation mapping that keeps queries fast over time.

TypescriptNodeResilience

Code

snippet
import winston from 'winston';
import 'winston-elasticsearch';

const esTransport = new winston.transports.Elasticsearch({
  index: 'svc-logs',
  indexPrefixTemplate: 'svc-logs',
  clientOpts: { node: 'http://elastic:9200' },
  buffering: true,
  bufferLimit: 500,
  flushInterval: 5_000,
  ensureIndexTemplate: true,
  retryLimit: 3,
});

export const logger = winston.createLogger({
  level: 'info',
  defaultMeta: { service: 'search-api', env: process.env.NODE_ENV },
  format: winston.format.combine(
    winston.format.timestamp({ format: 'YYYY-MM-DDTHH:mm:ss.SSSZ' }),
    winston.format.json(),
  ),
  transports: [esTransport],
});

logger.info('query served', { query: 'blue shoes', tookMs: 18, hits: 231 });
logger.warn('slow query', { query: 'umbrella', tookMs: 950 });
logger.error('upstream timeout', { shard: 's-3', retry: 1 });

esTransport.on('error', (err) => {
  process.stderr.write('es transport failed: ' + err.message + '\n');
});