109 lines
2.3 KiB
TypeScript
109 lines
2.3 KiB
TypeScript
import { Notice } from "obsidian";
|
|
|
|
export enum LogLevel {
|
|
DEBUG = "DEBUG",
|
|
INFO = "INFO",
|
|
WARNING = "WARNING",
|
|
ERROR = "ERROR"
|
|
}
|
|
|
|
const LOG_LEVEL_ORDER = {
|
|
[LogLevel.DEBUG]: 0,
|
|
[LogLevel.INFO]: 1,
|
|
[LogLevel.WARNING]: 2,
|
|
[LogLevel.ERROR]: 3
|
|
};
|
|
|
|
class LogLine {
|
|
public timestamp = new Date();
|
|
public constructor(
|
|
public level: LogLevel,
|
|
public message: string
|
|
) {}
|
|
}
|
|
|
|
export class Logger {
|
|
private static readonly MAX_MESSAGES = 1000;
|
|
|
|
private static instance: Logger | null = null;
|
|
private readonly messages: LogLine[] = [];
|
|
|
|
private readonly onMessageListeners: ((
|
|
status: LogLine | undefined
|
|
) => void)[] = [];
|
|
|
|
private constructor() {} // eslint-disable-line @typescript-eslint/no-empty-function
|
|
|
|
public static getInstance(): Logger {
|
|
if (!Logger.instance) {
|
|
Logger.instance = new Logger();
|
|
}
|
|
return Logger.instance;
|
|
}
|
|
|
|
public debug(message: string): void {
|
|
if (process.env.NODE_ENV !== "production") {
|
|
console.debug(message);
|
|
}
|
|
this.pushMessage(message, LogLevel.DEBUG);
|
|
}
|
|
|
|
public info(message: string): void {
|
|
if (process.env.NODE_ENV !== "production") {
|
|
console.info(message);
|
|
}
|
|
|
|
this.pushMessage(message, LogLevel.INFO);
|
|
}
|
|
|
|
public warn(message: string): void {
|
|
if (process.env.NODE_ENV !== "production") {
|
|
console.warn(message);
|
|
}
|
|
|
|
this.pushMessage(message, LogLevel.WARNING);
|
|
}
|
|
|
|
public error(message: string): void {
|
|
if (process.env.NODE_ENV !== "production") {
|
|
console.error(message);
|
|
}
|
|
|
|
this.pushMessage(message, LogLevel.ERROR);
|
|
new Notice(message, 5000);
|
|
}
|
|
|
|
public getMessages(mininumSeverity: LogLevel): LogLine[] {
|
|
return this.messages.filter(
|
|
(message) =>
|
|
LOG_LEVEL_ORDER[message.level] >=
|
|
LOG_LEVEL_ORDER[mininumSeverity]
|
|
);
|
|
}
|
|
|
|
public addOnMessageListener(
|
|
listener: (message: LogLine | undefined) => void
|
|
): void {
|
|
this.onMessageListeners.push(listener);
|
|
}
|
|
|
|
public reset(): void {
|
|
this.messages.length = 0;
|
|
this.onMessageListeners.forEach((listener) => {
|
|
listener(undefined);
|
|
});
|
|
}
|
|
|
|
private pushMessage(message: string, level: LogLevel): void {
|
|
const logLine = new LogLine(level, message);
|
|
this.messages.push(logLine);
|
|
|
|
while (this.messages.length > Logger.MAX_MESSAGES) {
|
|
this.messages.shift();
|
|
}
|
|
|
|
this.onMessageListeners.forEach((listener) => {
|
|
listener(logLine);
|
|
});
|
|
}
|
|
}
|