~starkingdoms/starkingdoms

ref: f73656c66fcec95e0957a7500c291926e0dcab2e starkingdoms/client/src/logger.ts -rw-r--r-- 2.8 KiB
f73656c6 — core the server currently does much nothing 2 years ago
                                                                                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
// LOG LEVELS:
// 0: Fatal
// 1: Error
// 2: Warn
// 3: Info
// 4: Debug
// Logs are written in-memory and logged to console if logLevel > showLogLevel
let loglevel = 0;

export const LEVEL_FATAL = 0;
export const LEVEL_ERROR = 1;
export const LEVEL_WARN = 2;
export const LEVEL_INFO = 3;
export const LEVEL_DEBUG = 4;

interface LogLine {
    level: number,
    module: string,
    message: string,
    timestamp: number,
    deltaStart: number,
    deltaLast: number
}

const debugLog: Array<LogLine> = [];
let timestampStart: number;
let deltaTimestamp: number;
let logger: Logger;
let loggerSetup = false;

export function logSetup() {
    if (loggerSetup) return;
    loggerSetup = true;
    timestampStart = Date.now();
    deltaTimestamp = Date.now();
    logger = new Logger("Logger.ts");
    consoleLogLevel(LEVEL_INFO);
    logger.info("Logger setup complete");
}

function log(level: number, module: string, message: string) {
    const log = {
        level: level,
        module: module,
        message: message,
        timestamp: Date.now(),
        deltaStart: Date.now() - timestampStart,
        deltaLast: Date.now() - deltaTimestamp
    };
    deltaTimestamp = Date.now();

    debugLog.push(log);

    consoleLogHandler(log);
}

function consoleLogHandler(log: LogLine) {
    if (import.meta.env.SSR) return; // no logging in ssr
    if (log.level <= loglevel) {
        let textstyle = "";
        switch (log.level) {
            case 0:
                textstyle = "color:red;font-weight:bold;";
                break;
            case 1:
                textstyle = "color:red;";
                break;
            case 2:
                textstyle = "color:yellow;";
                break;
            case 3:
                textstyle = "";
                break;
            case 4:
                textstyle = "color:gray;";
                break;
        }
        console.log(`%c${new Date(log.timestamp).toISOString()} ${(log.deltaStart / 1000).toFixed(3)}Σ ${(log.deltaLast / 1000).toFixed(3)}Δ\n%c[${log.module}]%c ${log.message}`, "color:gray", "color:#8c188c", textstyle);
    }
}

export function consoleLogLevel(level: number) {
    loglevel = level;
}

export function consoleLogDump() {
    for (let i = 0; i < debugLog.length; i++) {
        consoleLogHandler(debugLog[i]);
    }
}

export class Logger {
    private readonly name: string;

    constructor(name: string) {
        this.name = name;
    }

    fatal(message: any) {
        log(LEVEL_FATAL, this.name, message)
    }

    error(message: any) {
        log(LEVEL_ERROR, this.name, message)
    }

    warn(message: any) {
        log(LEVEL_WARN, this.name, message)
    }

    info(message: any) {
        log(LEVEL_INFO, this.name, message)
    }

    debug(message: any) {
        log(LEVEL_DEBUG, this.name, message)
    }
}