From 131c8db9c7434222ed41f3dc211275606b3dda20 Mon Sep 17 00:00:00 2001 From: Icebob Date: Sat, 31 Aug 2019 16:13:46 +0200 Subject: [PATCH] add bunyan & debug --- .eslintrc.js | 2 +- dev/loglevel.js | 45 ++++++++++++++++++++++++--------- package-lock.json | 27 +++++++++++++++++--- package.json | 1 + src/logger.js | 2 ++ src/loggers/bunyan.js | 3 ++- src/loggers/console.js | 38 +++++++++++++++++++--------- src/loggers/debug.js | 41 ++++++++++++++++++++++++++++++- src/loggers/index.js | 1 + src/loggers/pino.js | 16 +++++++----- src/loggers/winston.js | 56 +++++++++++++++++++++++++++++++++++++++++- 11 files changed, 194 insertions(+), 38 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index c4040bf4a..24eb2f96b 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -13,7 +13,7 @@ module.exports = { ], "parserOptions": { "sourceType": "module", - "ecmaVersion": "2017" + "ecmaVersion": "2018" }, "plugins": [ "node", diff --git a/dev/loglevel.js b/dev/loglevel.js index d7d6bb306..6144311a1 100644 --- a/dev/loglevel.js +++ b/dev/loglevel.js @@ -2,43 +2,64 @@ const ServiceBroker = require("../src/service-broker"); const { extend } = require("../src/logger"); +const winston = require("winston"); const broker = new ServiceBroker({ logger: [ - /*{ + { type: "Console", options: { //level: "error", //formatter: (type, args, bindings) => [].concat(args, bindings) //formatter: "simple", - moduleColors: true + moduleColors: true, + autoPadding: true } - },*/ + }, /*{ type: "Pino", options: { - options: { - base: null + pino: { + options: { + base: null + }, + //destination: "d:/pino.log" } - //destination: "d:/pino.log" } },*/ - { + /*{ type: "Bunyan", options: { bunyan: { name: "my-app" } } - } + },*/ + /*{ + type: "Winston", + options: { + winston: { + transports: [ + new winston.transports.Console(), + new winston.transports.File({ filename: "d:/winston.log" }) + ] + } + } + },*/ + /*{ + type: "Debug", + options: { + + } + }*/ ], - /*logLevel: { - "MY.**": false, + logLevel: { + //"MY.**": false, "TRANS*": "warn", "*.GREETER": "debug", "**": "debug", - },*/ - logLevel: "info", + }, + //logLevel: "info", //logFormatter: "short", transporter: "NATS", cacher: "Memory" diff --git a/package-lock.json b/package-lock.json index c58fddbb6..e8196ef18 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1399,6 +1399,17 @@ "buffer-more-ints": "~1.0.0", "debug": "~2.6.9", "safe-buffer": "~5.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } } }, "bl": { @@ -2432,12 +2443,20 @@ } }, "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" + }, + "dependencies": { + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } } }, "decamelize": { diff --git a/package.json b/package.json index f14463675..6c787a605 100644 --- a/package.json +++ b/package.json @@ -57,6 +57,7 @@ "bunyan": "1.8.12", "coveralls": "3.0.6", "dd-trace": "0.14.0", + "debug": "4.1.1", "dotenv": "8.1.0", "eslint": "6.2.2", "eslint-plugin-node": "9.1.0", diff --git a/src/logger.js b/src/logger.js index ffe587ce9..c6ee8f85b 100644 --- a/src/logger.js +++ b/src/logger.js @@ -103,6 +103,8 @@ class LogFactory { logHandlers.forEach(fn => fn(type, args)); };*/ + logger.appenders = appenders; + this.cache.set(this.getBindingsKey(bindings), logger); diff --git a/src/loggers/bunyan.js b/src/loggers/bunyan.js index a71b88484..979558561 100644 --- a/src/loggers/bunyan.js +++ b/src/loggers/bunyan.js @@ -34,6 +34,7 @@ class BunyanLogger extends BaseLogger { createLogger: null }); } + /** * Initialize logger. * @@ -57,7 +58,7 @@ class BunyanLogger extends BaseLogger { getLogHandler(bindings) { let level = this.getLogLevel(bindings ? bindings.mod : null); if (!level) - level = "silent"; + return null; const logger = _.isFunction(this.opts.createLogger) ? this.opts.createLogger(level, bindings) : this.bunyan.child({ level, ...bindings }); diff --git a/src/loggers/console.js b/src/loggers/console.js index acbcd65f5..a8741bd59 100644 --- a/src/loggers/console.js +++ b/src/loggers/console.js @@ -46,7 +46,8 @@ class ConsoleLogger extends BaseLogger { colors: true, moduleColors: false, formatter: null, - objectPrinter: null + objectPrinter: null, + autoPadding: false }); } @@ -65,18 +66,30 @@ class ConsoleLogger extends BaseLogger { }, {}); if (this.opts.colors && this.opts.moduleColors === true) { - this.opts.moduleColors = ["cyan", "yellow", "green", "magenta", "red", "blue", "white", "grey", - "bold.cyan", "bold.yellow", "bold.green", "bold.magenta", "bold.red", "bold.blue", "bold.white", "bold.grey"]; + this.opts.moduleColors = ["cyan", "yellow", "green", "magenta", "red", "blue", "grey", /*"white,"*/ + "bold.cyan", "bold.yellow", "bold.green", "bold.magenta", "bold.red", "bold.blue", "bold.grey"]; } this.colorCnt = 0; } /** - * + * Get a color for the module name. */ - getNextColor() { - if (this.opts.colors && Array.isArray(this.opts.moduleColors)) - return this.opts.moduleColors[this.colorCnt++ % this.opts.moduleColors.length]; + getNextColor(mod) { + if (this.opts.colors && Array.isArray(this.opts.moduleColors)) { + // Credits: "visionmedia/debug" https://github.com/visionmedia/debug/blob/master/src/common.js#L45 + let hash = 0; + + for (let i = 0; i < mod.length; i++) { + hash = ((hash << 5) - hash) + mod.charCodeAt(i); + hash |= 0; // Convert to 32bit integer + } + + return this.opts.moduleColors[Math.abs(hash) % this.opts.moduleColors.length]; + + + //return this.opts.moduleColors[this.colorCnt++ % this.opts.moduleColors.length]; + } return "grey"; } @@ -90,9 +103,8 @@ class ConsoleLogger extends BaseLogger { if (_.isFunction(formatter)) return (type, args) => formatter(type, args, bindings); - const c = this.getNextColor(); - const mod = (bindings && bindings.mod) ? bindings.mod.toUpperCase() : ""; + const c = this.getNextColor(mod); const modColorName = c.split(".").reduce((a,b) => a[b] || a()[b], kleur)(mod); const moduleColorName = bindings ? kleur.grey(bindings.nodeID + "/") + modColorName : ""; @@ -121,10 +133,12 @@ class ConsoleLogger extends BaseLogger { * @param {object} bindings */ getLogHandler(bindings) { - const formatter = this.getFormatter(bindings); - const level = this.getLogLevel(bindings ? bindings.mod : null); - const levelIdx = level ? BaseLogger.LEVELS.indexOf(level) : -1; + if (!level) + return null; + + const levelIdx = BaseLogger.LEVELS.indexOf(level); + const formatter = this.getFormatter(bindings); return (type, args) => { const typeIdx = BaseLogger.LEVELS.indexOf(type); diff --git a/src/loggers/debug.js b/src/loggers/debug.js index 18a550025..5d181e5b5 100644 --- a/src/loggers/debug.js +++ b/src/loggers/debug.js @@ -27,9 +27,48 @@ class DebugLogger extends BaseLogger { constructor(opts) { super(opts); - this.opts = _.defaultsDeep(this.opts, {}); + this.opts = _.defaultsDeep(this.opts, { + createLogger: null + }); } + /** + * Initialize logger. + * + * @param {LogFactory} logFactory + */ + init(logFactory) { + super.init(logFactory); + + try { + this.debug = require("debug")("moleculer"); + } catch(err) { + /* istanbul ignore next */ + this.broker.fatal("The 'debug' package is missing! Please install it with 'npm install debug --save' command!", err, true); + } + } + + /** + * + * @param {object} bindings + */ + getLogHandler(bindings) { + const mod = bindings ? bindings.mod : null; + const level = this.getLogLevel(mod); + if (!level) + return null; + + const levelIdx = BaseLogger.LEVELS.indexOf(level); + + const logger = _.isFunction(this.opts.createLogger) ? this.opts.createLogger(level, bindings) : this.debug.extend(mod); + + return (type, args) => { + const typeIdx = BaseLogger.LEVELS.indexOf(type); + if (typeIdx > levelIdx) return; + + return logger(...args); + }; + } } module.exports = DebugLogger; diff --git a/src/loggers/index.js b/src/loggers/index.js index 1a1fbf99b..61814cfd4 100644 --- a/src/loggers/index.js +++ b/src/loggers/index.js @@ -16,6 +16,7 @@ const Loggers = { Console: require("./console"), Debug: require("./debug"), File: require("./file"), + Log4js: require("./log4js"), Pino: require("./pino"), Winston: require("./winston"), diff --git a/src/loggers/pino.js b/src/loggers/pino.js index 773c33fbe..dec153fbe 100644 --- a/src/loggers/pino.js +++ b/src/loggers/pino.js @@ -28,10 +28,12 @@ class PinoLogger extends BaseLogger { super(opts); this.opts = _.defaultsDeep(this.opts, { - // http://getpino.io/#/docs/api?id=options-object - options: null, - // http://getpino.io/#/docs/api?id=destination-sonicboom-writablestream-string - destination: null, + pino: { + // http://getpino.io/#/docs/api?id=options-object + options: null, + // http://getpino.io/#/docs/api?id=destination-sonicboom-writablestream-string + destination: null, + }, createLogger: null }); @@ -47,7 +49,9 @@ class PinoLogger extends BaseLogger { try { const Pino = require("pino"); - this.pino = Pino(this.opts.options ? this.opts.options : undefined, this.opts.destination ? this.opts.destination : null); + this.pino = Pino( + this.opts.pino && this.opts.pino.options ? this.opts.pino.options : undefined, + this.opts.pino && this.opts.pino.destination ? this.opts.pino.destination : null); } catch(err) { /* istanbul ignore next */ this.broker.fatal("The 'pino' package is missing! Please install it with 'npm install pino --save' command!", err, true); @@ -61,7 +65,7 @@ class PinoLogger extends BaseLogger { getLogHandler(bindings) { let level = this.getLogLevel(bindings ? bindings.mod : null); if (!level) - level = "silent"; + return null; const logger = _.isFunction(this.opts.createLogger) ? this.opts.createLogger(level, bindings) : this.pino.child({ level, ...bindings }); diff --git a/src/loggers/winston.js b/src/loggers/winston.js index ea9c207a8..33e7d518d 100644 --- a/src/loggers/winston.js +++ b/src/loggers/winston.js @@ -27,9 +27,63 @@ class WinstonLogger extends BaseLogger { constructor(opts) { super(opts); - this.opts = _.defaultsDeep(this.opts, {}); + this.opts = _.defaultsDeep(this.opts, { + winston: { + level: "silly", + }, + createLogger: null + }); } + /** + * Initialize logger. + * + * @param {LogFactory} logFactory + */ + init(logFactory) { + super.init(logFactory); + + try { + this.winston = require("winston").createLogger(this.opts.winston); + } catch(err) { + /* istanbul ignore next */ + this.broker.fatal("The 'winston' package is missing! Please install it with 'npm install winston --save' command!", err, true); + } + } + + /** + * + * @param {object} bindings + */ + getLogHandler(bindings) { + let level = this.getLogLevel(bindings ? bindings.mod : null); + if (!level) + return null; + + const levelIdx = BaseLogger.LEVELS.indexOf(level); + + const logger = _.isFunction(this.opts.createLogger) ? this.opts.createLogger(level, bindings) : this.winston.child({ level, ...bindings }); + + return (type, args) => { + const typeIdx = BaseLogger.LEVELS.indexOf(type); + if (typeIdx > levelIdx) return; + + switch(type) { + case "info": return logger.info(...args); + case "fatal": + case "error": return logger.error(...args); + case "warn": return logger.warn(...args); + case "debug": return logger.debug(...args); + case "trace": return logger.log("silly", ...args); + default: { + if (logger[type]) + return logger[type](...args); + + return logger.info(...args); + } + } + }; + } } module.exports = WinstonLogger;