Skip to content
Merged
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
64 changes: 64 additions & 0 deletions src/app/logger/core.test.ts
Original file line number Diff line number Diff line change
@@ -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", {});
});
});
18 changes: 6 additions & 12 deletions src/app/logger/core.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,25 +30,19 @@ export default class LoggerCore {
writer: Writer;

// 日志级别, 会记录在日志文件中
level: LogLevel = "info";
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 || this.level;
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;
}
Expand Down
28 changes: 28 additions & 0 deletions src/app/logger/message_writer.test.ts
Original file line number Diff line number Diff line change
@@ -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)
);
});
});
8 changes: 7 additions & 1 deletion src/app/logger/message_writer.ts
Original file line number Diff line number Diff line change
@@ -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,
Expand Down
2 changes: 1 addition & 1 deletion src/pages/batchupdate/main.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import "@App/index.css";

// 初始化日志组件
const loggerCore = new LoggerCore({
writer: new MessageWriter(message),
writer: MessageWriter.serviceWorker(message),
labels: { env: "batchupdate" },
});

Expand Down
2 changes: 1 addition & 1 deletion src/pages/confirm/main.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import "@App/index.css";

// 初始化日志组件
const loggerCore = new LoggerCore({
writer: new MessageWriter(message),
writer: MessageWriter.serviceWorker(message),
labels: { env: "confirm" },
});

Expand Down
2 changes: 1 addition & 1 deletion src/pages/import/main.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import "@App/index.css";

// 初始化日志组件
const loggerCore = new LoggerCore({
writer: new MessageWriter(message),
writer: MessageWriter.serviceWorker(message),
labels: { env: "import" },
});

Expand Down
2 changes: 1 addition & 1 deletion src/pages/install/main.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import "@App/index.css";

// 初始化日志组件
const loggerCore = new LoggerCore({
writer: new MessageWriter(message),
writer: MessageWriter.serviceWorker(message),
labels: { env: "install" },
});

Expand Down
2 changes: 1 addition & 1 deletion src/pages/options/main.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import "@App/index.css";

// 初始化日志组件
const loggerCore = new LoggerCore({
writer: new MessageWriter(message),
writer: MessageWriter.serviceWorker(message),
labels: { env: "options" },
});

Expand Down
2 changes: 1 addition & 1 deletion src/pages/popup/main.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ preloadPopupData();

// 初始化日志组件
const loggerCore = new LoggerCore({
writer: new MessageWriter(message),
writer: MessageWriter.serviceWorker(message),
labels: { env: "popup" },
});

Expand Down
Loading