123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163 |
- '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;
|