platform-helpers/log4js-wrapper.js

'use strict';

const rootRequire = require('rpcm-root-require');
const log4js = require('log4js');
const fse = require('fs-extra');
rootRequire('/platform-helpers/string-extensions');

/**
 *
 * log.setLevel(Level.WARN);
 *
 * log.trace("Trace Message!");
 * log.debug("Debug Message!");
 * log.info("Info Message!");
 * log.warn("Warn Message!");
 * log.error("Error Message!");
 * log.fatal("Fatal Message!");
 *
 * Warn Message!
 * Error Message!
 * Fatal Message!
 *
 */
class LoggerWrapper {
  static #isInitialised = false;
  static LogLevels = {
    TRACE: 'trace',
    DEBUG: 'debug',
    INFO: 'info',
    WARN: 'warn',
    ERROR: 'error',
    FATAL: 'fatal'
  };

  static logFileSystemInfo = {
    fileName: 'application.log',
    folder: '{0}/{1}'.format(rootRequire.rootPath, 'logs/app'),
    fullName: '{0}/{1}/{2}'.format(rootRequire.rootPath, 'logs/app', 'application.log')
  };

  static getLogger = (category) => {
    if (!LoggerWrapper.#isInitialised) {
      fse.ensureDirSync(LoggerWrapper.logFileSystemInfo.folder);
      fse.readdirSync(LoggerWrapper.logFileSystemInfo.folder).forEach(file => fse.removeSync(file));

      log4js.configure({
        appenders: {
          out: { type: 'stdout', level: LoggerWrapper.LogLevels.INFO },
          app: { type: 'fileSync', filename: LoggerWrapper.logFileSystemInfo.fullName },
          file: { type: 'multiFile', base: LoggerWrapper.logFileSystemInfo.folder, property: 'fileName', extension: '.log' }
        },
        categories: {
          default: { appenders: ['out', 'app'], level: LoggerWrapper.LogLevels.TRACE },
          file: { appenders: ['file'], level: LoggerWrapper.LogLevels.TRACE }
        }
      });
      LoggerWrapper.#isInitialised = true;
    }
    return log4js.getLogger(category);
  };
}

module.exports = LoggerWrapper;