From 2a521d0407fd9f5fe2bf89d93a233c7e3ef8ffe4 Mon Sep 17 00:00:00 2001 From: CodFrm Date: Thu, 16 Jul 2026 21:07:01 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=F0=9F=90=9B=20=E4=BF=AE=E5=A4=8D=E5=BC=80?= =?UTF-8?q?=E5=8F=91=E7=8E=AF=E5=A2=83=20debug=20=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E6=8C=81=E4=B9=85=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/logger/core.test.ts | 64 +++++++++++++++++++++++++++ src/app/logger/core.ts | 4 +- src/app/logger/message_writer.test.ts | 28 ++++++++++++ src/app/logger/message_writer.ts | 8 +++- src/pages/batchupdate/main.tsx | 2 +- src/pages/confirm/main.tsx | 2 +- src/pages/import/main.tsx | 2 +- src/pages/install/main.tsx | 2 +- src/pages/options/main.tsx | 2 +- src/pages/popup/main.tsx | 2 +- 10 files changed, 107 insertions(+), 9 deletions(-) create mode 100644 src/app/logger/core.test.ts create mode 100644 src/app/logger/message_writer.test.ts diff --git a/src/app/logger/core.test.ts b/src/app/logger/core.test.ts new file mode 100644 index 000000000..e53957a98 --- /dev/null +++ b/src/app/logger/core.test.ts @@ -0,0 +1,64 @@ +import { afterEach, describe, expect, it, vi } from "vitest"; +import LoggerCore, { type Writer } from "./core"; + +const createWriter = () => ({ write: vi.fn() }) satisfies Writer; + +afterEach(() => { + vi.unstubAllEnvs(); +}); + +describe("LoggerCore 持久化日志级别", () => { + it("开发环境默认应持久化 debug 但不持久化 trace", () => { + vi.stubEnv("NODE_ENV", "development"); + const writer = createWriter(); + const logger = new LoggerCore({ writer, consoleLevel: "none", labels: {} }).logger(); + + logger.trace("trace message"); + logger.debug("debug message"); + + expect(writer.write).toHaveBeenCalledOnce(); + expect(writer.write).toHaveBeenCalledWith("debug", "debug message", {}); + }); + + it("生产环境默认不应持久化 debug 但应持久化 info", () => { + vi.stubEnv("NODE_ENV", "production"); + const writer = createWriter(); + const logger = new LoggerCore({ writer, consoleLevel: "none", labels: {} }).logger(); + + logger.debug("debug message"); + logger.info("info message"); + + expect(writer.write).toHaveBeenCalledOnce(); + expect(writer.write).toHaveBeenCalledWith("info", "info message", {}); + }); + + it("显式级别应覆盖环境默认值", () => { + vi.stubEnv("NODE_ENV", "development"); + const developmentWriter = createWriter(); + const developmentLogger = new LoggerCore({ + writer: developmentWriter, + level: "info", + consoleLevel: "none", + labels: {}, + }).logger(); + + developmentLogger.debug("debug message"); + developmentLogger.info("info message"); + + vi.stubEnv("NODE_ENV", "production"); + const productionWriter = createWriter(); + const productionLogger = new LoggerCore({ + writer: productionWriter, + level: "debug", + consoleLevel: "none", + labels: {}, + }).logger(); + + productionLogger.debug("debug message"); + + expect(developmentWriter.write).toHaveBeenCalledOnce(); + expect(developmentWriter.write).toHaveBeenCalledWith("info", "info message", {}); + expect(productionWriter.write).toHaveBeenCalledOnce(); + expect(productionWriter.write).toHaveBeenCalledWith("debug", "debug message", {}); + }); +}); diff --git a/src/app/logger/core.ts b/src/app/logger/core.ts index 7c4bd8ceb..c265f53c7 100644 --- a/src/app/logger/core.ts +++ b/src/app/logger/core.ts @@ -30,7 +30,7 @@ export default class LoggerCore { writer: Writer; // 日志级别, 会记录在日志文件中 - level: LogLevel = "info"; + level: LogLevel; // 打印在console的等级, 会在控制台输出 consoleLevel: LogLevel = "warn"; @@ -39,7 +39,7 @@ export default class LoggerCore { constructor(config: { level?: LogLevel; consoleLevel?: LogLevel; writer: Writer; labels: LogLabel }) { this.writer = config.writer; - this.level = config.level || this.level; + this.level = config.level ?? (process.env.NODE_ENV === "development" ? "debug" : "info"); this.labels = config.labels || {}; // 获取日志debug等级, 如果是开发环境, 则默认为debug if (config.consoleLevel !== undefined) { diff --git a/src/app/logger/message_writer.test.ts b/src/app/logger/message_writer.test.ts new file mode 100644 index 000000000..507ad165f --- /dev/null +++ b/src/app/logger/message_writer.test.ts @@ -0,0 +1,28 @@ +import EventEmitter from "eventemitter3"; +import { describe, expect, it, vi } from "vitest"; +import { MockMessage } from "@Packages/message/mock_message"; +import { SenderRuntime, Server } from "@Packages/message/server"; +import MessageWriter from "./message_writer"; + +describe("MessageWriter 页面日志路由", () => { + it("页面调用方应将日志发送到 service worker 的 logger 处理器", () => { + const message = new MockMessage(new EventEmitter()); + const handler = vi.fn(); + const server = new Server("serviceWorker", message, false); + server.on("logger", handler); + const writer = MessageWriter.serviceWorker(message); + + writer.write("info", "page message", { env: "options" }); + + expect(handler).toHaveBeenCalledWith( + { + id: 0, + level: "info", + message: "page message", + label: { env: "options" }, + createtime: expect.any(Number), + }, + expect.any(SenderRuntime) + ); + }); +}); diff --git a/src/app/logger/message_writer.ts b/src/app/logger/message_writer.ts index 091601613..e39bcf289 100644 --- a/src/app/logger/message_writer.ts +++ b/src/app/logger/message_writer.ts @@ -1,13 +1,19 @@ import type { LogLabel, LogLevel, Writer } from "./core"; import type { MessageSend } from "@Packages/message/types"; +type LoggerAction = `${"serviceWorker" | "scripting" | "offscreen"}/logger`; + // 通过通讯机制写入日志 export default class MessageWriter implements Writer { constructor( private msgSender: MessageSend, - private action: string = "logger" + private action: LoggerAction ) {} + static serviceWorker(msgSender: MessageSend): MessageWriter { + return new MessageWriter(msgSender, "serviceWorker/logger"); + } + write(level: LogLevel, message: string, label: LogLabel): void { this.msgSender.sendMessage({ action: this.action, diff --git a/src/pages/batchupdate/main.tsx b/src/pages/batchupdate/main.tsx index fcc841530..7dd3cd344 100644 --- a/src/pages/batchupdate/main.tsx +++ b/src/pages/batchupdate/main.tsx @@ -11,7 +11,7 @@ import "@App/index.css"; // 初始化日志组件 const loggerCore = new LoggerCore({ - writer: new MessageWriter(message), + writer: MessageWriter.serviceWorker(message), labels: { env: "batchupdate" }, }); diff --git a/src/pages/confirm/main.tsx b/src/pages/confirm/main.tsx index aaeab6364..b0730c002 100644 --- a/src/pages/confirm/main.tsx +++ b/src/pages/confirm/main.tsx @@ -10,7 +10,7 @@ import "@App/index.css"; // 初始化日志组件 const loggerCore = new LoggerCore({ - writer: new MessageWriter(message), + writer: MessageWriter.serviceWorker(message), labels: { env: "confirm" }, }); diff --git a/src/pages/import/main.tsx b/src/pages/import/main.tsx index 66f124810..8912e68de 100644 --- a/src/pages/import/main.tsx +++ b/src/pages/import/main.tsx @@ -11,7 +11,7 @@ import "@App/index.css"; // 初始化日志组件 const loggerCore = new LoggerCore({ - writer: new MessageWriter(message), + writer: MessageWriter.serviceWorker(message), labels: { env: "import" }, }); diff --git a/src/pages/install/main.tsx b/src/pages/install/main.tsx index 1449d5eec..8b20835e6 100644 --- a/src/pages/install/main.tsx +++ b/src/pages/install/main.tsx @@ -10,7 +10,7 @@ import "@App/index.css"; // 初始化日志组件 const loggerCore = new LoggerCore({ - writer: new MessageWriter(message), + writer: MessageWriter.serviceWorker(message), labels: { env: "install" }, }); diff --git a/src/pages/options/main.tsx b/src/pages/options/main.tsx index 7e7731efd..5641c92ce 100644 --- a/src/pages/options/main.tsx +++ b/src/pages/options/main.tsx @@ -11,7 +11,7 @@ import "@App/index.css"; // 初始化日志组件 const loggerCore = new LoggerCore({ - writer: new MessageWriter(message), + writer: MessageWriter.serviceWorker(message), labels: { env: "options" }, }); diff --git a/src/pages/popup/main.tsx b/src/pages/popup/main.tsx index 5819868d4..f3578b9d5 100644 --- a/src/pages/popup/main.tsx +++ b/src/pages/popup/main.tsx @@ -13,7 +13,7 @@ preloadPopupData(); // 初始化日志组件 const loggerCore = new LoggerCore({ - writer: new MessageWriter(message), + writer: MessageWriter.serviceWorker(message), labels: { env: "popup" }, }); From 766c8d8dff9c56822109d352febe0414da9770c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E4=B8=80=E4=B9=8B?= Date: Thu, 16 Jul 2026 22:41:27 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20=E7=AE=80=E5=8C=96?= =?UTF-8?q?=E6=97=A5=E5=BF=97=E7=8E=AF=E5=A2=83=E9=BB=98=E8=AE=A4=E7=BA=A7?= =?UTF-8?q?=E5=88=AB=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/logger/core.ts | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/src/app/logger/core.ts b/src/app/logger/core.ts index c265f53c7..90ec3ae26 100644 --- a/src/app/logger/core.ts +++ b/src/app/logger/core.ts @@ -33,22 +33,16 @@ export default class LoggerCore { level: LogLevel; // 打印在console的等级, 会在控制台输出 - consoleLevel: LogLevel = "warn"; + consoleLevel: LogLevel; labels: LogLabel; constructor(config: { level?: LogLevel; consoleLevel?: LogLevel; writer: Writer; labels: LogLabel }) { + const isDevelopment = process.env.NODE_ENV === "development"; this.writer = config.writer; - this.level = config.level ?? (process.env.NODE_ENV === "development" ? "debug" : "info"); - this.labels = config.labels || {}; - // 获取日志debug等级, 如果是开发环境, 则默认为debug - if (config.consoleLevel !== undefined) { - this.consoleLevel = config.consoleLevel; - } else { - if (process.env.NODE_ENV === "development") { - this.consoleLevel = "debug"; - } - } + this.level = config.level ?? (isDevelopment ? "debug" : "info"); + this.consoleLevel = config.consoleLevel ?? (isDevelopment ? "debug" : "warn"); + this.labels = config.labels; if (!LoggerCore.instance) { LoggerCore.instance = this; }