File size: 1,713 Bytes
0bcc252
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import { AbstractPinoLogger } from 'civkit/pino-logger';
import { singleton, container } from 'tsyringe';
import { threadId } from 'node:worker_threads';
import { getTraceCtx } from 'civkit/async-context';


const levelToSeverityMap: { [k: string]: string | undefined; } = {
    trace: 'DEFAULT',
    debug: 'DEBUG',
    info: 'INFO',
    warn: 'WARNING',
    error: 'ERROR',
    fatal: 'CRITICAL',
};

@singleton()
export class GlobalLogger extends AbstractPinoLogger {
    loggerOptions = {
        level: 'debug',
        base: {
            tid: threadId,
        }
    };

    override init(): void {
        if (process.env['NODE_ENV']?.startsWith('prod')) {
            super.init(process.stdout);
        } else {
            const PinoPretty = require('pino-pretty').PinoPretty;
            super.init(PinoPretty({
                singleLine: true,
                colorize: true,
                messageFormat(log: any, messageKey: any) {
                    return `${log['tid'] ? `[${log['tid']}]` : ''}[${log['service'] || 'ROOT'}] ${log[messageKey]}`;
                },
            }));
        }


        this.emit('ready');
    }

    override log(...args: any[]) {
        const [levelObj, ...rest] = args;
        const severity = levelToSeverityMap[levelObj?.level];
        const traceCtx = getTraceCtx();
        const patched: any= { ...levelObj, severity };
        if (traceCtx?.traceId && process.env['GCLOUD_PROJECT']) {
            patched['logging.googleapis.com/trace'] = `projects/${process.env['GCLOUD_PROJECT']}/traces/${traceCtx.traceId}`;
        }
        return super.log(patched, ...rest);
    }
}

const instance = container.resolve(GlobalLogger);
export default instance;