feat: Add real-time log streaming and logging stack configuration

fix: Fix exit signal handle
This commit is contained in:
2025-01-03 21:48:29 +08:00
parent ebd90ca352
commit 5a851be2c3
5 changed files with 128 additions and 8 deletions

View File

@@ -59,7 +59,11 @@ export function format_message(
}).join(" ");
}
class BaseLogger {
type EventMap = {
new_log: LogEntry;
};
class BaseLogger extends EventTarget {
db?: Db;
#cfg?: Config;
#exist_table: Set<string> = new Set();
@@ -144,16 +148,36 @@ class BaseLogger {
level >= LogLevel.Warn
? stackTrace(2)
: undefined;
this.db.query(
"INSERT INTO log (time, message, level, type, stack) VALUES (?, ?, ?, ?, ?);",
const now = new Date();
const result = this.db.query<[number | bigint]>(
"INSERT INTO log (time, message, level, type, stack) VALUES (?, ?, ?, ?, ?) RETURNING id;",
[
Date.now(),
now.getTime(),
message,
level,
type,
stack === undefined ? null : stack,
],
);
if (result) {
const entry: LogEntry = {
id: result[0][0],
time: now,
message,
level,
type,
stack,
};
this.dispatchEvent("new_log", entry);
}
}
// @ts-ignore Better type inference
addEventListener<T extends keyof EventMap>(
type: T,
callback: (e: CustomEvent<EventMap[T]>) => void | Promise<void>,
options?: boolean | AddEventListenerOptions,
): void {
super.addEventListener(type, <EventListener> callback, options);
}
clear(
type?: string | null,
@@ -245,6 +269,13 @@ class BaseLogger {
if (!this.db) return;
this.db.query("DELETE FROM log WHERE id = ?;", [id]);
}
// @ts-ignore Different parameters
dispatchEvent<T extends keyof EventMap>(
type: T,
detail: EventMap[T],
): boolean {
return super.dispatchEvent(new CustomEvent(type, { detail }));
}
error(type: string, ...messages: unknown[]) {
this.add(type, LogLevel.Error, ...messages);
}
@@ -369,6 +400,18 @@ class BaseLogger {
if (!this.db) return;
this.db.query("VACUUM;");
}
// @ts-ignore Better type inference
removeEventListener<T extends keyof EventMap>(
type: T,
callback: (e: CustomEvent<EventMap[T]>) => void | Promise<void>,
options?: boolean | EventListenerOptions,
): void {
super.removeEventListener(
type,
<EventListener> callback,
options,
);
}
trace(type: string, ...messages: unknown[]) {
this.add(type, LogLevel.Trace, ...messages);
}