Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
53 changes: 38 additions & 15 deletions packages/agoric-cli/src/anylogger-agoric.js
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand All @@ -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;
};
23 changes: 14 additions & 9 deletions packages/cosmic-swingset/src/anylogger-agoric.js
Original file line number Diff line number Diff line change
Expand Up @@ -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'`,
Copy link
Preview

Copilot AI Sep 16, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Inconsistent use of backticks around 'unset'. The original code used double quotes, and this should maintain consistency with the surrounding text formatting.

Suggested change
* environment variable DEBUG is non-empty or `'unset'`,
* environment variable DEBUG is non-empty or "unset",

Copilot uses AI. Check for mistakes.

* 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").
*
Expand All @@ -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);
Expand Down
Loading