import * as _ from "lodash"; import * as assert from "assert"; import * as winston from "winston"; // import * as winston_logstash from "winston-logstash"; const TRANSPORT_OPTIONS: any = { File: function(config) { let options = _.extend({ name: 'common', filename: 'service.log' }, config); return new winston.transports.File(options); }, Console: function(config) { let options = _.extend({ colorize: true, humanReadableUnhandledException: true }, config); return new winston.transports.Console(options); } }; TRANSPORT_OPTIONS.file = TRANSPORT_OPTIONS.File; TRANSPORT_OPTIONS.console = TRANSPORT_OPTIONS.Console; let NODE_ENV = process.env.NODE_ENV || "development"; let IS_DEV = (NODE_ENV=="development"); let _create_transports = function (config) { assert(config, "missing config"); let transports = []; // each key/value is a transport _.each(config, function (options: any, name: string) { let _o = options as any; if (_.isObject(options) && !(_o.enabled===false)) { // transport destination can be explicit or implicit declared let type = _o.to || name; assert(TRANSPORT_OPTIONS[type], 'api:logger:transport:not-found:'+type); let logger = TRANSPORT_OPTIONS[type](options); transports.push(logger); // context.log({ code: "api:logger:transport", name: name, message: "log to "+type } ); } }); if (IS_DEV && !(config.console || config.Console) ) { transports.push( TRANSPORT_OPTIONS.Console({ enabled: true }) ); console.log( "development always logs to Console" ); } return transports; } export function define_logger(options: any) { if (options.enabled===false) { console.log("logging is explicitly disabled"); return null; } let _transports = _create_transports(options); assert(_transports, 'api:logger:transports:missing'); return winston.createLogger({ level: options.loglevel || IS_DEV?'debug':'info', format: winston.format.json(), transports: _transports }); }