UNPKG

@midwayjs/web

Version:

Midway Web Framework for Egg.js

213 lines 8.45 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.createLoggers = void 0; const logger_1 = require("@midwayjs/logger"); const path_1 = require("path"); const core_1 = require("@midwayjs/core"); const util_1 = require("util"); const core_2 = require("@midwayjs/core"); const loggerModule = require("@midwayjs/logger"); const isV3Logger = loggerModule['formatLegacyLoggerOptions']; const debug = (0, util_1.debuglog)('midway:debug'); const levelTransform = level => { // egg 自定义日志,不设置 level,默认是 info if (!level) { return 'info'; } switch (level) { case 'NONE': case Infinity: // egg logger 的 none 是这个等级 return 'none'; case 0: case 'DEBUG': case 'debug': return 'debug'; case 1: case 'INFO': case 'info': return 'info'; case 2: case 'WARN': case 'warn': return 'warn'; case 3: case 'ERROR': case 'error': return 'error'; default: return 'silly'; } }; function cleanUndefinedProperty(obj) { Object.keys(obj).forEach(key => { if (obj[key] === undefined) { delete obj[key]; } }); } class MidwayLoggers extends Map { /** * @constructor * - 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} [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 common-error.log, `duplicate` / `redirect` / `ignore` * - customLogger * @param app */ constructor(app) { super(); /** * 在 egg 这里创建 loggers,并初始化 loggerService */ // 这么改是为了防止 egg 日志切割时遍历属性,导致报错 Object.defineProperty(this, 'app', { value: app, enumerable: false, }); const configService = (0, core_1.getCurrentApplicationContext)().get(core_1.MidwayConfigService); // 先把 egg 的日志配置转为 midway logger 配置 if (configService.getConfiguration('customLogger')) { const eggLoggerConfig = this.transformEggLogger(configService.getConfiguration('customLogger'), configService.getConfiguration('midwayLogger.default')); if (eggLoggerConfig) { configService.addObject(eggLoggerConfig); } } let loggerConfig = configService.getConfiguration('midwayLogger'); // 这里属于 hack 了,cluster 模式下会先走这里,找不到默认值 // 先合并一遍默认配置 configService.addObject(logger_1.loggers.getDefaultMidwayLoggerConfig(configService.getAppInfo()), true); loggerConfig = configService.getConfiguration('midwayLogger'); // 这里利用了 loggers 缓存的特性,提前初始化 logger if (loggerConfig) { for (const id of Object.keys(loggerConfig.clients)) { const config = (0, core_2.extend)(true, {}, loggerConfig['default'], loggerConfig.clients[id]); this.createLogger(config, id); } } if (!this['logger']) { this['logger'] = logger_1.loggers.getLogger('appLogger'); this.set('logger', logger_1.loggers.getLogger('appLogger')); } // 初始化日志服务 this.loggerService = (0, core_1.getCurrentApplicationContext)().get(core_1.MidwayLoggerService, [ (0, core_1.getCurrentApplicationContext)(), { loggerFactory: logger_1.loggers, }, ]); // 防止循环枚举报错 Object.defineProperty(this, 'loggerService', { enumerable: false, }); } createLogger(options, loggerKey) { let logger = logger_1.loggers.createLogger(loggerKey, options); // overwrite values for pandora collect logger.values = () => { return []; }; if (process.env['EGG_CLUSTER_MODE'] !== 'true') { logger = new Proxy(logger, { get(target, prop, receiver) { if (prop === 'close') { return () => { }; } return target[prop]; }, }); } this[loggerKey] = logger; this.set(loggerKey, logger); return logger; } disableConsole() { var _a; for (const value of this.values()) { if (value === null || value === void 0 ? void 0 : value['disableConsole']) { value.disableConsole(); } else if (value.disable) { value.disable('console'); } else if (isV3Logger) { // v3 // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore (_a = value.get('console')) === null || _a === void 0 ? void 0 : _a.level = 'none'; } } } reload() { // 忽略 midway logger,只有 egg logger 需要做切割 for (const value of this.values()) { if (value.reload) { value.reload(); } } } transformEggLogger(eggCustomLogger, midwayLoggerConfig) { var _a, _b, _c, _d; const transformLoggerConfig = { midwayLogger: { clients: {}, }, }; for (const name in eggCustomLogger) { const file = (_a = eggCustomLogger[name]) === null || _a === void 0 ? void 0 : _a.file; if (!file) { continue; } const options = {}; if ((0, path_1.isAbsolute)(file)) { // 绝对路径,单独处理 options.dir = (0, path_1.dirname)(file); options.fileLogName = (0, path_1.basename)(file); options.auditFileDir = midwayLoggerConfig['auditFileDir'] === '.audit' ? (0, path_1.join)(midwayLoggerConfig['dir'], '.audit') : midwayLoggerConfig['auditFileDir']; options.errorDir = (_b = midwayLoggerConfig['errorDir']) !== null && _b !== void 0 ? _b : midwayLoggerConfig['dir']; } else { // 相对路径,使用默认的 dir 即可 options.fileLogName = file; } transformLoggerConfig.midwayLogger.clients[name] = { level: levelTransform((_c = eggCustomLogger[name]) === null || _c === void 0 ? void 0 : _c.level), consoleLevel: levelTransform((_d = eggCustomLogger[name]) === null || _d === void 0 ? void 0 : _d.consoleLevel), ...options, }; cleanUndefinedProperty(transformLoggerConfig.midwayLogger.clients[name]); } return transformLoggerConfig; } } const createLoggers = (app, processType) => { // 现在只走 midway logger const loggers = new MidwayLoggers(app); // won't print to console after started, except for local and unittest app.ready(() => { var _a; if ((_a = app.config.logger) === null || _a === void 0 ? void 0 : _a.disableConsoleAfterReady) { loggers.disableConsole(); } }); debug(`[egg]: create loggers in ${processType}`); loggers['coreLogger'].info('[egg:logger] init all loggers with options: %j', app.config.midwayLogger); return loggers; }; exports.createLoggers = createLoggers; //# sourceMappingURL=logger.js.map