UNPKG

@eagleoutice/flowr-dev

Version:

Static Dataflow Analyzer and Program Slicer for the R Programming Language

86 lines 3 kB
"use strict"; 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