@zenvia/logger
Advanced tools
Comparing version 1.4.1 to 1.4.3
{ | ||
"name": "@zenvia/logger", | ||
"version": "1.4.1", | ||
"version": "1.4.3", | ||
"description": "A wrapper for Winston Logging Node.js library that formats the output on STDOUT as Logstash JSON format.", | ||
@@ -5,0 +5,0 @@ "license": "MIT", |
declare module '@zenvia/logger' { | ||
import { Logger } from 'winston'; | ||
const logger: Logger; | ||
import { Logger, LeveledLogMethod } from 'winston'; | ||
interface ZenviaLogger extends Logger { | ||
fatal: LeveledLogMethod; | ||
isFatalEnabled(): boolean; | ||
} | ||
const logger: ZenviaLogger; | ||
export = logger; | ||
} |
@@ -0,3 +1,5 @@ | ||
/* eslint-disable prefer-rest-params */ | ||
/* eslint-disable no-param-reassign */ | ||
/* eslint-disable import/no-dynamic-require */ | ||
/* eslint-disable no-use-before-define */ | ||
@@ -34,3 +36,2 @@ const winston = require('winston'); | ||
const customCombineJson = winston.format.combine( | ||
winston.format.splat(), | ||
customFormatJson(), | ||
@@ -42,27 +43,10 @@ winston.format.json(), | ||
winston.format.timestamp(), | ||
winston.format.splat(), | ||
winston.format.printf((info) => (`${info.timestamp} - ${info.level}: ${info.message}`)), | ||
); | ||
const customErrorFormatter = winston.format((info) => { | ||
if (info instanceof Error) { | ||
return { | ||
message: info.message, | ||
stack: info.stack, | ||
...info, | ||
}; | ||
} | ||
return info; | ||
}); | ||
const createConsoleTransport = () => new winston.transports.Console({ | ||
level: process.env.LOGGING_LEVEL || 'debug', | ||
stderrLevels: ['fatal', 'error'], | ||
format: process.env.LOGGING_FORMATTER_DISABLED && process.env.LOGGING_FORMATTER_DISABLED === 'true' ? customCombineSimple : customCombineJson, | ||
handleExceptions: true, | ||
humanReadableUnhandledException: true, | ||
}); | ||
/* eslint-disable new-cap */ | ||
const logger = new winston.createLogger({ | ||
const logger = winston.createLogger({ | ||
levels: { | ||
@@ -77,6 +61,5 @@ fatal: 0, | ||
}, | ||
format: winston.format.combine( | ||
customErrorFormatter(), | ||
winston.format.json(), | ||
), | ||
level: process.env.LOGGING_LEVEL || 'debug', | ||
handleExceptions: true, | ||
format: process.env.LOGGING_FORMATTER_DISABLED && process.env.LOGGING_FORMATTER_DISABLED === 'true' ? customCombineSimple : customCombineJson, | ||
transports: [ | ||
@@ -88,2 +71,41 @@ createConsoleTransport(), | ||
function leveledLogFn(level) { | ||
return function log(...args) { | ||
return logFn(level, ...args); | ||
}; | ||
} | ||
function logFn(level, msg) { | ||
if (arguments.length === 1 && typeof level !== 'object') { | ||
return logger; | ||
} | ||
if (arguments.length === 2) { | ||
if (msg && typeof msg === 'object') { | ||
msg = { | ||
message: msg.message, | ||
stack: msg.stack, | ||
...msg, | ||
}; | ||
} | ||
} | ||
return logger.realLog(...arguments); | ||
} | ||
function isLevelEnabledFn(level) { | ||
return function isLevelEnabled() { | ||
return logger.isLevelEnabled(level); | ||
}; | ||
} | ||
logger.fatal = leveledLogFn('fatal'); | ||
logger.error = leveledLogFn('error'); | ||
logger.warn = leveledLogFn('warn'); | ||
logger.info = leveledLogFn('info'); | ||
logger.debug = leveledLogFn('debug'); | ||
logger.verbose = leveledLogFn('verbose'); | ||
logger.silly = leveledLogFn('silly'); | ||
logger.isFatalEnabled = isLevelEnabledFn('fatal'); | ||
logger.realLog = logger.log; | ||
logger.log = logFn; | ||
module.exports = logger; |
@@ -48,15 +48,10 @@ const os = require('os'); | ||
it('should log empty message fields when message is not provided', () => { | ||
it('should not log when message is not provided', () => { | ||
logger.info(); | ||
const expectedOutput = { | ||
'@timestamp': '2018-06-05T18:20:42.345Z', | ||
'@version': 1, | ||
application: 'application-name', | ||
host: os.hostname(), | ||
message: '', | ||
level: 'INFO', | ||
}; | ||
stdMocks.flush().stdout.length.should.be.equal(0); | ||
}); | ||
const actualOutput = stdMocks.flush().stdout[0]; | ||
JSON.parse(actualOutput).should.be.deep.equal(expectedOutput); | ||
it('should not log when only level provided', () => { | ||
logger.log('info'); | ||
stdMocks.flush().stdout.length.should.be.equal(0); | ||
}); | ||
@@ -179,3 +174,11 @@ | ||
describe('Logging level', () => { | ||
it('should log with LogEntry', () => { | ||
const obj = { level: 'info', message: 'some message', property: 'some value' }; | ||
logger.log(obj); | ||
const actualOutput = JSON.parse(stdMocks.flush().stdout[0]); | ||
actualOutput.should.have.property('level').and.be.equal('INFO'); | ||
}); | ||
it('should log as FATAL level', () => { | ||
logger.isFatalEnabled().should.be.equal(true); | ||
logger.fatal('some message'); | ||
@@ -256,2 +259,32 @@ const actualOutput = JSON.parse(stdMocks.flush().stderr[0]); | ||
}); | ||
describe('Reliability', () => { | ||
it('should not mutate the original error object when log this object without any other data', () => { | ||
const error = new Error('some reason'); | ||
error.should.not.have.property('level'); | ||
logger.info(error); | ||
error.should.not.have.property('level'); | ||
}); | ||
it('should not mutate the original object when log this object without any other data', () => { | ||
const obj = { message: 'some value' }; | ||
obj.should.not.have.property('level'); | ||
logger.info(obj); | ||
obj.should.not.have.property('level'); | ||
}); | ||
it('should not mutate the original error object when log with level and object', () => { | ||
const error = new Error('some reason'); | ||
error.should.not.have.property('level'); | ||
logger.log('error', error); | ||
error.should.not.have.property('level'); | ||
}); | ||
it('should not mutate the original object when log with level and object', () => { | ||
const obj = { property: 'some value' }; | ||
obj.should.not.have.property('level'); | ||
logger.log('info', obj); | ||
obj.should.not.have.property('level'); | ||
}); | ||
}); | ||
}); |
21489
376