All files index.ts

83.67% Statements 41/49
63.33% Branches 19/30
100% Functions 2/2
83.67% Lines 41/49

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 1081x 1x 1x 1x   1x 1x 1x     1x 4x 4x 4x 4x 4x 4x 4x 4x 4x 2x   4x                                       1x     3x 3x         3x 3x   3x       3x 2x 2x 2x 2x     2x 2x 2x 2x     2x                   2x   3x     3x                     3x 1x     2x            
import { ElasticsearchTransport, ElasticsearchTransportOptions } from 'winston-elasticsearch';
import * as winstonESTransformer from '@restorecommerce/winston-elasticsearch-transformer';
import * as rTracer from 'cls-rtracer';
import { WinstonLoggerOptions, Transports, format, WinstonLogger, TransportStreamArray, log } from './winston';
 
const mappingTemplate = winstonESTransformer.mappingTemplate;
const transformer = winstonESTransformer.transformer;
const { timestamp, printf } = format;
 
// a custom format that outputs request id
const rTracerFormat = printf((info) => {
  const rid = rTracer.id();
  const time = info.timestamp;
  const level = info.level;
  const message = info.message;
  delete info.timestamp;
  delete info.level;
  delete info.message;
  let object = '';
  if (Object.entries(info).length !== 0 && info.constructor === Object) {
    object = JSON.stringify(info);
  }
  return rid
    ? `${level} : ${time} [rid:${rid}] : ${message} ${((object))}`
    : `${level} : ${time} : ${message} ${(object)}`;
});
 
export interface RestoreLoggerOptions extends WinstonLoggerOptions {
  loggerName?: string;
  console?: Transports.ConsoleTransportOptions & {
    // Custom console opts here
    prettyPrint?:  boolean | any;
    colorize?: boolean | any;
  };
  file?: Transports.FileTransportOptions & {
    // Custom file opts here
  };
  elasticsearch?: ElasticsearchTransportOptions & {
    source?: any;
  };
}
 
export class Logger extends WinstonLogger {
  constructor(opts: RestoreLoggerOptions) {
    // Set up logging
    (log as any).namespaces = true;
    Iif (!opts) {
      throw new Error('Options are missing');
    }
 
    // Provide TransportStream array and add opts.transports
    let transports: TransportStreamArray = [];
    Iif (opts.transports && !Array.isArray(transports)) {
      transports = [transports];
    } else Iif (Array.isArray(opts.transports)) {
      transports = opts.transports;
    }
 
    if (opts.console) {
      let colorize = undefined;
      Eif (opts.console.colorize !== false) {
        const colorizeOpts = typeof opts.console.colorize === 'object' ? opts.console.colorize : undefined;
        colorize = format.colorize(colorizeOpts);
      }
 
      let prettyPrint = undefined;
      Eif (opts.console.prettyPrint !== false) {
        const prettyPrintOpts = typeof opts.console.prettyPrint === 'object' ? opts.console.prettyPrint : undefined;
        prettyPrint = format.prettyPrint(prettyPrintOpts);
      }
 
      const consoleOpts = {
        format: format.combine(
          colorize,
          prettyPrint,
          format.simple(),
          timestamp(),
          rTracerFormat
        ),
        ...opts.console,
      };
      transports.push(new Transports.Console(consoleOpts));
    }
    Iif (opts.file) {
      transports.push(new Transports.File(opts.file));
    }
    Iif (opts.elasticsearch) {
      const elasticsearchOpts = {
        mappingTemplate,
        ...opts.elasticsearch,
      };
 
      transformer.source = opts.elasticsearch.source;
      elasticsearchOpts.transformer = transformer;
      transports.push(new ElasticsearchTransport(elasticsearchOpts));
    }
 
    if (transports.length <= 0) {
      throw new Error('Provide at least one supported transport');
    }
 
    super({
      ...opts,
      transports
    });
  }
}