diff --git a/lib/winston/create-logger.js b/lib/winston/create-logger.js index c17780640..fedfadaa4 100644 --- a/lib/winston/create-logger.js +++ b/lib/winston/create-logger.js @@ -45,7 +45,8 @@ class DerivedLogger extends Logger { // Define prototype methods for each log level // e.g. logger.log('info', msg) <––> logger.info(msg) & logger.isInfoEnabled() - this[level] = (...args) => { + // this is not an arrow function so it'll always be called on the instance instead of a fixed place in the prototype chain. + this[level] = function (...args) { // Optimize the hot-path which is the single object. if (args.length === 1) { const [msg] = args; diff --git a/test/logger.test.js b/test/logger.test.js index 48fa31bb4..da0beca28 100755 --- a/test/logger.test.js +++ b/test/logger.test.js @@ -66,6 +66,30 @@ describe('Logger', function () { }) }); + it('new Logger({ levels }) custom methods are not bound to instance', function () { + var logger = winston.createLogger({ + level: 'error', + exitOnError: false, + transports: [] + }); + + let logs = []; + + let extendedLogger = Object.create(logger,{ + write:{ + value:function(...args){ + logs.push(args); + } + } + }); + + extendedLogger.log({test:1}); + extendedLogger.warn({test:2}); + + assume(logs[0]||[]).is.eql([{test:1}]); + assume(logs[1]||[]).is.eql([{message:{test:2},level:'warn'}]); + }); + it('.add({ invalid Transport })', function () { var logger = winston.createLogger(); assume(function () {