src/common/WinstonLoggerStrategy.ts (33 lines of code) (raw):

import { createLogger, format, Logger as IWinstonLogger, transports } from "winston"; import ILoggerStrategy, { LogLevels } from "./ILoggerStrategy"; /** * A logger strategy can log to console or file. * * @export * @class WinstonLoggerStrategy * @implements {ILoggerStrategy} */ export default class WinstonLoggerStrategy implements ILoggerStrategy { private readonly winstonLogger: IWinstonLogger; private readonly consoleTransport?: transports.ConsoleTransportInstance; private readonly fileTransport?: transports.FileTransportInstance; /** * Creates an instance of WinstonLoggerStrategy. * * @param {LogLevels} [level=LogLevels.Debug] * @param {string} [logfile] Log to specific file, otherwise to console. * @memberof WinstonLoggerStrategy */ public constructor(level: LogLevels = LogLevels.Debug, logfile?: string) { this.winstonLogger = createLogger({ format: format.combine( format.timestamp(), format.printf( info => `${info.timestamp} ${info.contextID} ${info.level}: ${info.message}` ) ), level }); if (logfile) { this.fileTransport = new transports.File({ filename: logfile }); this.winstonLogger.add(this.fileTransport); } else { this.consoleTransport = new transports.Console(); this.winstonLogger.add(this.consoleTransport); } } public log( level: LogLevels, message: string, contextID: string = "\t" ): void { this.winstonLogger.log({ level, message, contextID }); } }