lib/Logger.js

/*!
 * clout-js
 * Copyright(c) 2015 - 2016 Muhammad Dadu
 * MIT Licensed
 */
/**
 * @module clout-js/lib/Logger
 */
const util = require('util');
const path = require('path');

const fs = require('fs-extra');
const debug = require('debug')('clout:logger');
const winston = require('winston');
const DailyRotateFile = require('winston-daily-rotate-file');

/**
 * Clout Logger (Extends winston)
 * @class
 * @extends winston.Logger
 */
class Logger extends winston.Logger {

	/**
	 * @constructor
	 * @param {object} clout clout-js instance
	 */
	constructor(clout) {
		debug('initialize logger');
		super();

		this.clout = clout;
		this.transports = [];

		this.clout.registerHook('start', this.appendToMiddleware, this.clout.CORE_PRIORITY.MIDDLEWARE);

		if (this.clout.config.logToDir === true) {
			this.logToDir();
		}

		// dont log to console in production
		if (clout.config.env !== 'production') {
			this.logToConsole();
		}

		this.saveConfiguration();
	}

	/**
	 * Appends logger to middleware
	 */
	appendToMiddleware(next) {
		this.app.use((req, resp, next) => {
			req.logger = this.logger;
			next();
		});
		next();
	}

	/**
	 * Enables logging to console
	 */
	logToConsole() {
		this.transports.push(new (winston.transports.Console)());
	}

	/**
	 * Enables logging to application directory
	 */
	logToDir() {
		let logDirectory = path.join(this.clout.rootDirectory, 'logs');

		fs.ensureDirSync(logDirectory);
		debug('logDirectory: %s', logDirectory);
		debug('add transport', 'DailyRotateFile');

		let dailyRotateFile = new DailyRotateFile({
			filename: path.join(logDirectory, 'clout_'),
			datePattern: 'yyyy-MM-dd.log'
		});

		this.transports.push(dailyRotateFile);
	}

	/**
	 * Save configuration and update log level
	 * @param  {String} level log level
	 */
	saveConfiguration(level) {
		this.configure({
			level: level || process.env.LOG_LEVEL || 'verbose',
			transports: this.transports
		});
	}
}

module.exports = Logger;