diff --git a/packages/agoric-cli/src/anylogger-agoric.js b/packages/agoric-cli/src/anylogger-agoric.js index 87bc1bb679f..c21c85a4dc0 100644 --- a/packages/agoric-cli/src/anylogger-agoric.js +++ b/packages/agoric-cli/src/anylogger-agoric.js @@ -3,14 +3,31 @@ import { getEnvironmentOption, getEnvironmentOptionsList, } from '@endo/env-options'; +import { defineName } from '@agoric/internal/src/js-utils.js'; + import anylogger from 'anylogger'; import chalk from 'chalk'; +/** + * @import {BaseLevels} from 'anylogger'; + * @typedef {keyof BaseLevels} LogLevel; + */ + const DEBUG_LIST = getEnvironmentOptionsList('DEBUG'); // Turn on debugging output with DEBUG=agoric or DEBUG=agoric:${level} -let selectedLevel = - DEBUG_LIST.length || getEnvironmentOption('DEBUG', 'unset') === 'unset' +/** + * As documented in ../../../docs/env.md, the log level defaults to "log" when + * environment variable DEBUG is non-empty or `'unset'`, + * and to the quieter "info" when it is set to an empty string, + * but in either case is overridden if DEBUG + * is a comma-separated list that contains "agoric:none" or "agoric:${level}" or + * "agoric" (the last an alias for "agoric:debug"). + * + * @type {string | undefined} + */ +let maxActiveLevel = + DEBUG_LIST.length > 0 || getEnvironmentOption('DEBUG', 'unset') === 'unset' ? 'log' : 'info'; for (const level of DEBUG_LIST) { @@ -19,29 +36,35 @@ for (const level of DEBUG_LIST) { continue; } if (parts.length > 1) { - selectedLevel = parts[1]; + maxActiveLevel = parts[1]; } else { - selectedLevel = 'debug'; + maxActiveLevel = 'debug'; } } -const selectedCode = anylogger.levels[selectedLevel]; -const globalCode = selectedCode === undefined ? -Infinity : selectedCode; +const selectedCode = anylogger.levels[maxActiveLevel]; +const maxActiveLevelCode = + selectedCode === undefined ? -Infinity : selectedCode; const oldExt = anylogger.ext; -anylogger.ext = (l, ...rest) => { - l = oldExt(l, ...rest); - l.enabledFor = lvl => globalCode >= anylogger.levels[lvl]; +anylogger.ext = logger => { + logger = oldExt(logger); + + /** @type {(level: LogLevel) => boolean} */ + const enabledFor = level => anylogger.levels[level] <= maxActiveLevelCode; + logger.enabledFor = enabledFor; - const prefix = l.name.replace(/:/g, ': '); + const prefix = logger.name.replace(/:/g, ': '); for (const [level, code] of Object.entries(anylogger.levels)) { - if (globalCode >= code) { + if (maxActiveLevelCode >= code) { // Enable the printing with a prefix. - const doLog = l[level] || (() => {}); - l[level] = (...args) => doLog(chalk.bold.blue(`${prefix}:`), ...args); + const doLog = logger[level] || defineName(`dummy ${level}`, () => {}); + logger[level] = defineName(level, (...args) => + doLog(chalk.bold.blue(`${prefix}:`), ...args), + ); } else { // Disable printing. - l[level] = () => {}; + logger[level] = defineName(`dummy ${level}`, () => {}); } } - return l; + return logger; }; diff --git a/packages/cosmic-swingset/src/anylogger-agoric.js b/packages/cosmic-swingset/src/anylogger-agoric.js index 9949e1e486a..5dbdc227183 100644 --- a/packages/cosmic-swingset/src/anylogger-agoric.js +++ b/packages/cosmic-swingset/src/anylogger-agoric.js @@ -3,23 +3,23 @@ import { getEnvironmentOptionsList, getEnvironmentOption, } from '@endo/env-options'; -import anylogger from 'anylogger'; import { defineName } from '@agoric/internal/src/js-utils.js'; -/** @import {BaseLevels} from 'anylogger'; */ -/** @typedef {keyof BaseLevels} LogLevel; */ +import anylogger from 'anylogger'; -const VAT_LOGGER_PREFIXES = Object.freeze([ - 'SwingSet:vat', - 'SwingSet:ls', // "ls" for "liveslots" -]); +/** + * @import {BaseLevels} from 'anylogger'; + * @typedef {keyof BaseLevels} LogLevel; + */ const DEBUG_LIST = getEnvironmentOptionsList('DEBUG'); +// Turn on debugging output with DEBUG=agoric or DEBUG=agoric:${level} /** * As documented in ../../../docs/env.md, the log level defaults to "log" when - * environment variable DEBUG is non-empty or unset, and to the quieter "info" - * when it is set to an empty string, but in either case is overridden if DEBUG + * environment variable DEBUG is non-empty or `'unset'`, + * and to the quieter "info" when it is set to an empty string, + * but in either case is overridden if DEBUG * is a comma-separated list that contains "agoric:none" or "agoric:${level}" or * "agoric" (the last an alias for "agoric:debug"). * @@ -40,6 +40,11 @@ const maxActiveLevelCode = /** @type {number} */ ( (maxActiveLevel && anylogger.levels[maxActiveLevel]) ?? -Infinity ); +const VAT_LOGGER_PREFIXES = harden([ + 'SwingSet:vat', + 'SwingSet:ls', // "ls" for "liveslots" +]); + const oldExt = anylogger.ext; anylogger.ext = logger => { logger = oldExt(logger);