@eagleoutice/flowr-dev
Version:
Static Dataflow Analyzer and Program Slicer for the R Programming Language
86 lines • 3 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.log = exports.LogLevelNames = exports.FlowrLogger = exports.expensiveTrace = void 0;
exports.setLogLevel = setLogLevel;
const tslog_1 = require("tslog");
const fs_1 = require("fs");
const expensiveTrace = (log, supplier) => {
if (log !== undefined && log.settings.minLevel <= 1 /* LogLevel.Trace */) {
log.trace(supplier());
}
};
exports.expensiveTrace = expensiveTrace;
/** The rotating stream, or `undefined` if the optional dependency is not installed. */
function rotatingStream(filename, options) {
try {
// eslint-disable-next-line @typescript-eslint/no-require-imports -- optional dependency, absent by design in slim installs
return require('rotating-file-stream').createStream(filename, options);
}
catch {
return undefined;
}
}
class FlowrLogger extends tslog_1.Logger {
/** by keeping track of all children we can propagate updates of the settings (e.g., in tests) */
childLoggers = [];
getSubLogger(settings, logObj) {
const newSubLogger = super.getSubLogger(settings, logObj);
this.childLoggers.push(newSubLogger);
return newSubLogger;
}
updateSettings(updater) {
updater(this);
this.childLoggers.forEach((child) => {
updater(child);
});
}
/**
* make the logger log to a file as well
*
* Rotation needs the optional `rotating-file-stream` dependency. Without it (the slim runtime images install with
* `--omit=optional`) the log is appended to a single file instead.
*/
logToFile(filename = 'flowr.log', options = {
size: '10M',
interval: '1d',
compress: 'gzip',
}) {
const stream = rotatingStream(filename, options) ?? (0, fs_1.createWriteStream)(filename, { flags: 'a' });
exports.log.attachTransport((logObj) => {
stream.write(`${JSON.stringify(logObj)}\n`);
});
}
}
exports.FlowrLogger = FlowrLogger;
exports.LogLevelNames = {
silly: 0 /* LogLevel.Silly */,
trace: 1 /* LogLevel.Trace */,
debug: 2 /* LogLevel.Debug */,
info: 3 /* LogLevel.Info */,
warn: 4 /* LogLevel.Warn */,
error: 5 /* LogLevel.Error */,
fatal: 6 /* LogLevel.Fatal */
};
/** Set the global minimum log level by name. */
function setLogLevel(level) {
exports.log.updateSettings(l => {
l.settings.minLevel = exports.LogLevelNames[level];
});
}
function getActiveLog() {
return new FlowrLogger({
// set the default minimum level as Warn, and let all apps
// (like the REPL) update it to whatever they want it to be
minLevel: 4 /* LogLevel.Warn */,
type: 'pretty',
name: 'main',
stylePrettyLogs: true,
prettyLogStyles: {
logLevelName: {
'*': ['bold', 'black', 'dim']
}
}
});
}
exports.log = getActiveLog();
//# sourceMappingURL=log.js.map