UNPKG

stryker

Version:
147 lines 7.33 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = require("tslib"); var log4js = require("log4js"); var logging_1 = require("stryker-api/logging"); var core_1 = require("stryker-api/core"); var logUtils_1 = require("./logUtils"); var netUtils_1 = require("../utils/netUtils"); var AppenderName; (function (AppenderName) { AppenderName["File"] = "file"; AppenderName["FilteredFile"] = "filteredFile"; AppenderName["Console"] = "console"; AppenderName["FilteredConsoleLevel"] = "filteredConsoleLevel"; AppenderName["FilteredConsoleCategory"] = "filteredConsoleCategory"; AppenderName["All"] = "all"; AppenderName["Server"] = "server"; })(AppenderName || (AppenderName = {})); var layouts = { color: { pattern: '%[%r (%z) %p %c%] %m', type: 'pattern' }, noColor: { pattern: '%r (%z) %p %c %m', type: 'pattern' } }; var LOG_FILE_NAME = 'stryker.log'; var LogConfigurator = /** @class */ (function () { function LogConfigurator() { } LogConfigurator.createMainProcessAppenders = function (consoleLogLevel, fileLogLevel, allowConsoleColors) { var _a, _b; // Add the custom "multiAppender": https://log4js-node.github.io/log4js-node/appenders.html#other-appenders var multiAppender = { type: require.resolve('./MultiAppender'), appenders: [AppenderName.FilteredConsoleLevel] }; var consoleLayout = allowConsoleColors ? layouts.color : layouts.noColor; var allAppenders = (_a = {}, _a[AppenderName.Console] = { type: 'stdout', layout: consoleLayout }, // Exclude messages like: "ERROR log4js A worker log process hung up unexpectedly" #1245 _a[AppenderName.FilteredConsoleCategory] = { type: 'categoryFilter', appender: AppenderName.Console, exclude: 'log4js' }, _a[AppenderName.FilteredConsoleLevel] = { type: 'logLevelFilter', appender: AppenderName.FilteredConsoleCategory, level: consoleLogLevel }, _a[AppenderName.All] = multiAppender, _a); // only add file if it is needed. Otherwise log4js will create the file directly, pretty annoying. if (fileLogLevel.toUpperCase() !== core_1.LogLevel.Off.toUpperCase()) { var fileAppender = { type: 'file', filename: LOG_FILE_NAME, layout: layouts.noColor }; var filteredFileAppender = { type: 'logLevelFilter', appender: 'file', level: fileLogLevel }; // Don't simply add the appenders, instead actually make sure they are ordinal "before" the others. // See https://github.com/log4js-node/log4js-node/issues/746 allAppenders = Object.assign((_b = {}, _b[AppenderName.File] = fileAppender, _b[AppenderName.FilteredFile] = filteredFileAppender, _b), allAppenders); multiAppender.appenders.push(AppenderName.FilteredFile); } return allAppenders; }; LogConfigurator.createLog4jsConfig = function (defaultLogLevel, appenders) { return { appenders: appenders, categories: { default: { appenders: [AppenderName.All], level: defaultLogLevel } } }; }; LogConfigurator.setImplementation = function () { logging_1.LoggerFactory.setLogImplementation(log4js.getLogger); }; /** * Configure logging for the master process. Either call this method or `configureChildProcess` before any `getLogger` calls. * @param consoleLogLevel The log level to configure for the console * @param fileLogLevel The log level to configure for the "stryker.log" file */ LogConfigurator.configureMainProcess = function (consoleLogLevel, fileLogLevel, allowConsoleColors) { if (consoleLogLevel === void 0) { consoleLogLevel = core_1.LogLevel.Information; } if (fileLogLevel === void 0) { fileLogLevel = core_1.LogLevel.Off; } if (allowConsoleColors === void 0) { allowConsoleColors = true; } this.setImplementation(); var appenders = this.createMainProcessAppenders(consoleLogLevel, fileLogLevel, allowConsoleColors); log4js.configure(this.createLog4jsConfig(logUtils_1.minLevel(consoleLogLevel, fileLogLevel), appenders)); }; /** * Configure the logging for the server. Includes the master configuration. * This method should only be called ONCE, as it starts the log4js server to listen for log events. * It returns the logging client context that should be used to configure the child processes. * * @param consoleLogLevel the console log level * @param fileLogLevel the file log level * @returns the context */ LogConfigurator.configureLoggingServer = function (consoleLogLevel, fileLogLevel, allowConsoleColors) { return tslib_1.__awaiter(this, void 0, void 0, function () { var loggerPort, appenders, multiProcessAppender, defaultLogLevel, context; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: this.setImplementation(); return [4 /*yield*/, netUtils_1.getFreePort()]; case 1: loggerPort = _a.sent(); appenders = this.createMainProcessAppenders(consoleLogLevel, fileLogLevel, allowConsoleColors); multiProcessAppender = { appender: AppenderName.All, loggerPort: loggerPort, mode: 'master', type: 'multiprocess' }; appenders[AppenderName.Server] = multiProcessAppender; defaultLogLevel = logUtils_1.minLevel(consoleLogLevel, fileLogLevel); log4js.configure(this.createLog4jsConfig(defaultLogLevel, appenders)); context = { level: defaultLogLevel, port: loggerPort }; return [2 /*return*/, context]; } }); }); }; /** * Configures the logging for a worker process. Sends all logging to the master process. * Either call this method or `configureMainProcess` before any `getLogger` calls. * @param context the logging client context used to configure the logging client */ LogConfigurator.configureChildProcess = function (context) { var _a; this.setImplementation(); var clientAppender = { type: 'multiprocess', mode: 'worker', loggerPort: context.port }; var appenders = (_a = {}, _a[AppenderName.All] = clientAppender, _a); log4js.configure(this.createLog4jsConfig(context.level, appenders)); }; LogConfigurator.shutdown = function () { return new Promise(function (res, rej) { log4js.shutdown(function (err) { if (err) { rej(err); } else { res(); } }); }); }; return LogConfigurator; }()); exports.default = LogConfigurator; //# sourceMappingURL=LogConfigurator.js.map