mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-07 09:51:24 +00:00
feat: add pre-prompt context size diagnostic logging (openclaw#8930) thanks @Glucksberg
Verified: - pnpm build - pnpm check - pnpm test Co-authored-by: Glucksberg <80581902+Glucksberg@users.noreply.github.com> Co-authored-by: Tak Hoffman <781889+Takhoffman@users.noreply.github.com>
This commit is contained in:
56
src/logging/subsystem.test.ts
Normal file
56
src/logging/subsystem.test.ts
Normal file
@@ -0,0 +1,56 @@
|
||||
import { afterEach, describe, expect, it } from "vitest";
|
||||
import { setConsoleSubsystemFilter } from "./console.js";
|
||||
import { resetLogger, setLoggerOverride } from "./logger.js";
|
||||
import { createSubsystemLogger } from "./subsystem.js";
|
||||
|
||||
afterEach(() => {
|
||||
setConsoleSubsystemFilter(null);
|
||||
setLoggerOverride(null);
|
||||
resetLogger();
|
||||
});
|
||||
|
||||
describe("createSubsystemLogger().isEnabled", () => {
|
||||
it("returns true for any/file when only file logging would emit", () => {
|
||||
setLoggerOverride({ level: "debug", consoleLevel: "silent" });
|
||||
const log = createSubsystemLogger("agent/embedded");
|
||||
|
||||
expect(log.isEnabled("debug")).toBe(true);
|
||||
expect(log.isEnabled("debug", "file")).toBe(true);
|
||||
expect(log.isEnabled("debug", "console")).toBe(false);
|
||||
});
|
||||
|
||||
it("returns true for any/console when only console logging would emit", () => {
|
||||
setLoggerOverride({ level: "silent", consoleLevel: "debug" });
|
||||
const log = createSubsystemLogger("agent/embedded");
|
||||
|
||||
expect(log.isEnabled("debug")).toBe(true);
|
||||
expect(log.isEnabled("debug", "console")).toBe(true);
|
||||
expect(log.isEnabled("debug", "file")).toBe(false);
|
||||
});
|
||||
|
||||
it("returns false when neither console nor file logging would emit", () => {
|
||||
setLoggerOverride({ level: "silent", consoleLevel: "silent" });
|
||||
const log = createSubsystemLogger("agent/embedded");
|
||||
|
||||
expect(log.isEnabled("debug")).toBe(false);
|
||||
expect(log.isEnabled("debug", "console")).toBe(false);
|
||||
expect(log.isEnabled("debug", "file")).toBe(false);
|
||||
});
|
||||
|
||||
it("honors console subsystem filters for console target", () => {
|
||||
setLoggerOverride({ level: "silent", consoleLevel: "info" });
|
||||
setConsoleSubsystemFilter(["gateway"]);
|
||||
const log = createSubsystemLogger("agent/embedded");
|
||||
|
||||
expect(log.isEnabled("info", "console")).toBe(false);
|
||||
});
|
||||
|
||||
it("does not apply console subsystem filters to file target", () => {
|
||||
setLoggerOverride({ level: "info", consoleLevel: "silent" });
|
||||
setConsoleSubsystemFilter(["gateway"]);
|
||||
const log = createSubsystemLogger("agent/embedded");
|
||||
|
||||
expect(log.isEnabled("info", "file")).toBe(true);
|
||||
expect(log.isEnabled("info")).toBe(true);
|
||||
});
|
||||
});
|
||||
@@ -6,13 +6,14 @@ import { defaultRuntime, type RuntimeEnv } from "../runtime.js";
|
||||
import { clearActiveProgressLine } from "../terminal/progress-line.js";
|
||||
import { getConsoleSettings, shouldLogSubsystemToConsole } from "./console.js";
|
||||
import { type LogLevel, levelToMinLevel } from "./levels.js";
|
||||
import { getChildLogger } from "./logger.js";
|
||||
import { getChildLogger, isFileLogLevelEnabled } from "./logger.js";
|
||||
import { loggingState } from "./state.js";
|
||||
|
||||
type LogObj = { date?: Date } & Record<string, unknown>;
|
||||
|
||||
export type SubsystemLogger = {
|
||||
subsystem: string;
|
||||
isEnabled: (level: LogLevel, target?: "any" | "console" | "file") => boolean;
|
||||
trace: (message: string, meta?: Record<string, unknown>) => void;
|
||||
debug: (message: string, meta?: Record<string, unknown>) => void;
|
||||
info: (message: string, meta?: Record<string, unknown>) => void;
|
||||
@@ -271,9 +272,26 @@ export function createSubsystemLogger(subsystem: string): SubsystemLogger {
|
||||
});
|
||||
writeConsoleLine(level, line);
|
||||
};
|
||||
const isConsoleEnabled = (level: LogLevel): boolean => {
|
||||
const consoleSettings = getConsoleSettings();
|
||||
return (
|
||||
shouldLogToConsole(level, { level: consoleSettings.level }) &&
|
||||
shouldLogSubsystemToConsole(subsystem)
|
||||
);
|
||||
};
|
||||
const isFileEnabled = (level: LogLevel): boolean => isFileLogLevelEnabled(level);
|
||||
|
||||
const logger: SubsystemLogger = {
|
||||
subsystem,
|
||||
isEnabled: (level, target = "any") => {
|
||||
if (target === "console") {
|
||||
return isConsoleEnabled(level);
|
||||
}
|
||||
if (target === "file") {
|
||||
return isFileEnabled(level);
|
||||
}
|
||||
return isConsoleEnabled(level) || isFileEnabled(level);
|
||||
},
|
||||
trace: (message, meta) => emit("trace", message, meta),
|
||||
debug: (message, meta) => emit("debug", message, meta),
|
||||
info: (message, meta) => emit("info", message, meta),
|
||||
|
||||
Reference in New Issue
Block a user