uriel
Version:
A NodeJS statsd agent to push memory, cpu, network, swap, diskio, and disk usage over UDP
72 lines (61 loc) • 2.01 kB
JavaScript
// app/lib/logger.js
// Dependencies
const assign = require('lodash.assign');
const fs = require('fs');
const winston = require('winston');
const { format } = winston;
/**
* A utility class to wrap Winston logging
* @class Logger
* @param {object} config - A global configuration object that may contain options on how to initialize the logger
* @example
* let logger = new logger(config);
*/
class Logger {
constructor(config) {
this.logDir = config.logging.logDir || './logs';
const transports = [
new winston.transports.File({
filename: `${this.logDir}/info.log`,
name: 'info-log',
level: 'info',
format: format.printf(this.formatter)
}),
new winston.transports.File({
filename: `${this.logDir}/error.log`,
name: 'error-log',
level: 'error',
format: format.printf(this.formatter)
})
];
// Optimization -- Add console logging if not in production
// if ((process.env.NODE_ENV !== 'production') && (process.env.NODE_ENV !== 'test')) {
transports.push(new winston.transports.Console({ level: 'debug', formatter: this.formatter }));
this.options = {
exitOnError: false,
format: winston.format.printf(this.formatter),
transports: transports
};
// Create log folder if it does not already exist
if (!fs.existsSync(config.logging.logDir)) {
console.log('Creating log folder');
fs.mkdirSync(config.logging.logDir);
}
// Merge options from config into this object
this.options = assign(this.options, config.logging.options);
this.log = winston.createLogger(this.options);
}
formatter(options) {
let message = options.message;
if (!message) {
message = JSON.parse(options[Symbol.for('message')])['@message'];
}
return `${new Date().toISOString()} [${options.level.toUpperCase()}]: ${message}`;
}
handleError(err) {
if (this.log) {
this.log.error(err);
}
}
}
module.exports = Logger;