@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).
139 lines (128 loc) • 3.77 kB
JavaScript
const { join, basename } = require('path');
const Bunyan = require('bunyan');
const {
createWriteStream,
ensureDirSync,
} = require('fs-extra');
const BaseLogger = require('./BaseLogger');
/**
* Bunyan Adapter for logging
* @class BunyanAdapter
* @extends {BaseLogger}
*/
class BunyanAdapter extends BaseLogger {
/**
* Creates an instance of BunyanAdapter.
*
* @constructor
* @param {LogOptions} logOptions options for configuring adapter
*/
constructor(logOptions) {
super();
this.env = process.env.NODE_ENV || process.env.NODE || 'local';
this.service = process.env.SERVICE || basename(process.cwd());
this.zone = logOptions.zone || 'IN';
this.logLevel = logOptions.level;
this.logOptions = logOptions;
this.logOptions.logPath = this.logOptions.logPath || join(process.cwd(), 'logs');
this.logOptions.logFile = this.logOptions.logFile || `${this.service}.log`;
ensureDirSync(join(this.logOptions.logPath));
this.configure();
}
/**
* Writes/Prints debug log event
*
* @override
* @param {any} log - Log Message to be printed
* @param {scope} scope - Scope (filename) to be used as log originator default: app
* @param {any} args - Event data to be logged
* @memberof BunyanAdapter
*/
debug(log, scope, ...args) {
super.debug.call(this, log, scope, args);
}
/**
* Writes/Prints info log event
*
* @override
* @param {any} log - Log Message to be printed
* @param {scope} scope - Scope (filename) to be used as log originator default: app
* @param {any} args - Event data to be logged
* @memberof BunyanAdapter
*/
info(log, scope, ...args) {
super.info.call(this, log, scope, args);
}
/**
* Writes and prints error event log
*
* @override
* @param {any} log - Log Message to be printed
* @param {scope} scope - Scope (filename) to be used as log originator default: app
* @param {any} args - Event data to be logged
* @memberof BunyanAdapter
*/
error(log, scope, ...args) {
super.error.call(this, log, scope, args);
}
/**
* Writes and prints error event log
*
* @override
* @param {any} log - Log Message to be printed
* @param {scope} scope - Scope (filename) to be used as log originator default: app
* @param {any} args - Event data to be logged
* @memberof BunyanAdapter
*/
fatal(log, scope, ...args) {
super.fatal.call(this, log, scope, args);
}
/**
* Returns the writeable stream for writing logs
*
* @private
* @return {WritableStream} - WriteableStream to log file.
* @memberof BunyanAdapter
*/
getWriteableStream() {
return createWriteStream(join(this.logOptions.logPath, this.logOptions.logFile), { flags: 'a' });
}
/**
* Gets the logging transports
*
* @private
* @return {Array} - Transport options that will be used by Adapter
* @memberof BunyanAdapter
*/
getTransports() {
return [
{ level: this.logLevel, type: 'raw', stream: BaseLogger.customFormatStream() },
{ level: this.logLevel, stream: this.getWriteableStream() },
];
}
/**
* Configures the Adapter with {@link LogOptions}
*
* @public
* @returns {void} nothing
* @memberof BunyanAdapter
*/
configure() {
this.logger = Bunyan.createLogger({
name: this.service,
level: this.logLevel,
streams: this.getTransports(),
microservice: this.service,
zone: this.zone,
env: this.env,
});
// eslint-disable-next-line
this.logger._emit = (rec, noemit) => {
const record = rec;
delete record.msg;
// eslint-disable-next-line
Bunyan.prototype._emit.call(this.logger, record, noemit);
};
}
}
module.exports = BunyanAdapter;