@midwayjs/web
Version:
Midway Web Framework for Egg.js
213 lines • 8.45 kB
JavaScript
;
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