@zebpay/colt
Version:
LoggerSDK for Microservices with multiple adapters eg: Pino, Winston, Bunyan with support for [Mapped Diagnostics Context](http://logback.qos.ch/manual/mdc.html).
88 lines (78 loc) • 2.35 kB
JavaScript
const flatten = require('flatten');
const { format } = require('winston');
const { Writable } = require('stream');
const bunyan = require('bunyan');
/**
* @type {BaseLogger}
*/
class BaseLogger {
// eslint-disable-next-line
formatMessage(data) {
return flatten(data)[0] || {};
}
debug(log, scope, args = []) {
this.logger.debug({
meta: scope,
message: log,
correlationIds: args.pop(),
event: this.formatMessage(args),
});
}
info(log, scope, args = []) {
this.logger.info({
meta: scope,
message: log,
correlationIds: args.pop(),
event: this.formatMessage(args),
});
}
error(log, scope, args = []) {
this.logger.error({
meta: scope,
correlationIds: args.pop(),
message: log.message || log,
error: BaseLogger.serializeError(args[0]),
});
}
fatal(log, scope, args = []) {
this.logger.fatal({
meta: scope,
correlationIds: args.pop(),
message: log.message || log,
error: BaseLogger.serializeError(args[0]),
});
}
static prettyMessage(log) {
const colorize = format.colorize({ colors: { info: 'white', fatal: 'magenta' } });
const service = log.level === 'info'
? ` [${log.microservice}] [${log.meta.substr(0, 6)}]`
: `[${log.microservice}] [${log.meta.substr(0, 6)}]`;
const mesg = log.level === 'info' && /^\s+/.test(log.message) ? log.message.substr(1) : log.message;
return colorize.colorize(
log.level,
// eslint-disable-next-line
`${log.level.toUpperCase()} ${service} ${mesg} ${JSON.stringify(log.event || log.error)} ${JSON.stringify({ correlationIds: log.correlationIds })}`,
);
}
static serializeError(error = []) {
const err = error.filter((el) => el);
if (!err) {
return {};
}
if (err && err[0] && err[0] instanceof Error) {
return { name: err[0].name, reason: err[0].message, stack: err[0].stack };
}
return { name: 'Error', reason: JSON.stringify(err), stack: {} };
}
static customFormatStream() {
const ws = new Writable();
ws.write = (obj) => {
const log = obj;
log.level = bunyan.nameFromLevel[obj.level];
process.stdout.write(BaseLogger.prettyMessage(log));
process.stdout.write('\n');
};
return ws;
}
}
module.exports = BaseLogger;