You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
47 lines
1.1 KiB
47 lines
1.1 KiB
type LogLevel = "log" | "info" | "warn" | "error";
|
|
|
|
interface LogEntry {
|
|
level: LogLevel;
|
|
message: unknown[];
|
|
timestamp: string;
|
|
}
|
|
|
|
class LogCollector {
|
|
private logs: LogEntry[] = [];
|
|
private originalConsole: Partial<
|
|
Record<LogLevel, (..._args: unknown[]) => void>
|
|
> = {};
|
|
|
|
constructor() {
|
|
(["log", "info", "warn", "error"] as LogLevel[]).forEach((level) => {
|
|
// eslint-disable-next-line no-console
|
|
this.originalConsole[level] = console[level];
|
|
// eslint-disable-next-line no-console
|
|
console[level] = (..._args: unknown[]) => {
|
|
this.logs.push({
|
|
level,
|
|
message: _args,
|
|
timestamp: new Date().toISOString(),
|
|
});
|
|
this.originalConsole[level]?.apply(console, _args);
|
|
};
|
|
});
|
|
}
|
|
|
|
getLogs(): string {
|
|
return this.logs
|
|
.map(
|
|
(entry) =>
|
|
`[${entry.timestamp}] [${entry.level.toUpperCase()}] ${entry.message
|
|
.map((m) => (typeof m === "object" ? JSON.stringify(m) : String(m)))
|
|
.join(" ")}`,
|
|
)
|
|
.join("\n");
|
|
}
|
|
|
|
clear() {
|
|
this.logs = [];
|
|
}
|
|
}
|
|
|
|
export const logCollector = new LogCollector();
|
|
|