'use strict'; const assert = require('assert'); const debug = require('debug')('egg:logger'); const utils = require('../utils'); const Logger = require('./logger'); const ErrorLogger = require('./error_logger'); const CustomLogger = require('./custom_logger'); const defaults = { env: 'default', type: '', dir: '', encoding: 'utf8', level: 'INFO', consoleLevel: 'NONE', outputJSON: false, outputJSONOnly: false, buffer: true, appLogName: '', coreLogName: '', agentLogName: '', errorLogName: '', concentrateError: 'duplicate', concentrateErrorLoggerName: 'errorLogger', }; /** * Logger Manager, accord config to create multi loggers. */ class Loggers extends Map { /** * @class * @param {Object} config - egg app config * - logger * - {String} env - egg app runtime env string, detail please see `app.config.env` * - {String} type - current process type, `application` or `agent` * - {String} dir - log file dir * - {String} [encoding = utf8] - log string encoding * - {String} [level = INFO] - file log level * - {String} [consoleLevel = NONE] - console log level * - {Boolean} [outputJSON = false] - send JSON log or not * - {Boolean} [outputJSONOnly = false] - only send JSON log * - {Boolean} [buffer = true] - use {@link FileBufferTransport} or not * - {String} appLogName - egg app file logger name * - {String} coreLogName - egg core file logger name * - {String} agentLogName - egg agent file logger name * - {String} errorLogName - err common error logger name * - {String} eol - end of line char * - {String} [concentrateError = duplicate] - whether write error logger to `concentrateErrorLoggerName` logger, `duplicate` / `redirect` / `ignore` * - {String} [concentrateErrorLoggerName = errorLogger] - concentrate logger name * - customLogger */ constructor(config) { super(); const loggerConfig = utils.assign({}, defaults, config.logger); const customLoggerConfig = config.customLogger; debug('Init loggers with options %j', loggerConfig); assert(loggerConfig.type, 'should pass config.logger.type'); assert(loggerConfig.dir, 'should pass config.logger.dir'); assert(loggerConfig.appLogName, 'should pass config.logger.appLogName'); assert(loggerConfig.coreLogName, 'should pass config.logger.coreLogName'); assert(loggerConfig.agentLogName, 'should pass config.logger.agentLogName'); assert(loggerConfig.errorLogName, 'should pass config.logger.errorLogName'); const errorLogger = new ErrorLogger(utils.assign({}, loggerConfig, { file: loggerConfig.errorLogName, })); this.set('errorLogger', errorLogger); let coreLogger; let logger; if (loggerConfig.type === 'agent') { logger = new Logger(utils.assign({}, loggerConfig, { file: loggerConfig.agentLogName, })); coreLogger = new Logger(utils.assign({}, loggerConfig, loggerConfig.coreLogger, { file: loggerConfig.agentLogName, })); } else { logger = new Logger(utils.assign({}, loggerConfig, { file: loggerConfig.appLogName, })); coreLogger = new Logger(utils.assign({}, loggerConfig, loggerConfig.coreLogger, { file: loggerConfig.coreLogName, })); } this.set('logger', logger); this.set('coreLogger', coreLogger); for (const name in customLoggerConfig) { const logger = new CustomLogger(utils.assign({}, loggerConfig, customLoggerConfig[name])); this.set(name, logger); } // setConcentrateError at the end this.setConcentrateError('logger', logger); this.setConcentrateError('coreLogger', coreLogger); for (const name in customLoggerConfig) { this.setConcentrateError(name, this.get(name)); } } /** * Disable console logger */ disableConsole() { for (const logger of this.values()) { logger.disable('console'); } } reload() { for (const logger of this.values()) { logger.reload(); } } /** * Add a logger * @param {String} name - logger name * @param {Logger} logger - Logger instance */ set(name, logger) { if (this.has(name)) { return; } this[name] = logger; super.set(name, logger); } setConcentrateError(name, logger) { // redirect ERROR log to errorLogger, except errorLogger itself if (name !== 'errorLogger') { const concentrateLogger = this.get(logger.options.concentrateErrorLoggerName); if (!concentrateLogger) return; switch (logger.options.concentrateError) { case 'duplicate': logger.duplicate('error', concentrateLogger, { excludes: [ 'console' ] }); break; case 'redirect': logger.redirect('error', concentrateLogger); break; case 'ignore': break; default: break; } } } } module.exports = Loggers;