stryker
Version:
The extendable JavaScript mutation testing framework
147 lines • 7.33 kB
JavaScript
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
;