lib/utils/logger.js
/* eslint import/no-dynamic-require: 0 */
const os = require('os');
const _ = require('lodash');
const path = require('path');
const {
createLogger,
format,
transports,
} = require('winston');
const preferenceManager = require('./preference-manager');
const {
combine,
timestamp,
printf,
} = format;
preferenceManager.setPreference({
name: 'default',
});
const config = preferenceManager.getPreference({ name: 'cliPrefs' }).logger;
const logDirectory = path.resolve(os.homedir(), config.logDirectory);
const logBlacklist = config.blacklist;
const logFormat = printf((info) => {
if (info.module) {
return `${info.timestamp} [${info.level}] ${info.module.toUpperCase()}: ${info.message}`;
}
return `${info.timestamp} [${info.level}] MAIN: ${info.message}`;
});
const filterJSON = message => JSON.stringify(_.mapValues(message, (value, key) => {
if (logBlacklist.includes(key)) { return '<removed>'; }
return value;
}));
const filterMessage = (message) => {
if (_.isPlainObject(message)) {
return filterJSON(message);
}
if (_.isArray(message)) {
return _.reduce(_.flattenDeep(message), (accum, element) => `${accum}
${_.isPlainObject(element) ? filterJSON(element) : element.toString()}`, '');
}
return message;
};
const logger = createLogger({
format: combine(
timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
logFormat,
),
transports: [new transports.File({ filename: path.resolve(logDirectory, config.logLocation) })],
exitOnError: false,
maxsize: config.maxSize,
});
logger.moduleLog = (level, module, message) => {
logger.log({
level,
module,
message: filterMessage(message),
});
};
module.exports = {
logger,
};