File size: 1,894 Bytes
de6a95b
 
38df3bf
0a6555d
c96ef69
 
38df3bf
0a6555d
 
 
38df3bf
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0a6555d
38df3bf
aec4d7f
0f2f80a
 
 
 
 
 
 
 
 
 
c96ef69
0f2f80a
 
 
 
 
 
 
 
 
 
c96ef69
 
 
 
 
0f2f80a
 
c96ef69
aec4d7f
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
import pino from 'pino';

const isProduction = process.env.NODE_ENV === 'production';

// Initialize the base pino instance
const baseLogger = pino({
    level: process.env.LOG_LEVEL || (isProduction ? 'info' : 'debug'),
    base: {
        env: process.env.NODE_ENV,
        service: 'api-gateway'
    },
    transport: {
        targets: [
            {
                target: 'pino-pretty',
                level: isProduction ? 'info' : 'debug',
                options: {
                    colorize: true,
                    ignore: 'pid,hostname',
                    translateTime: 'SYS:standard',
                }
            },
            ...(process.env.LOGTAIL_TOKEN ? [{
                target: '@logtail/pino',
                level: 'info',
                options: { sourceToken: process.env.LOGTAIL_TOKEN }
            }] : [])
        ]
    }
});

type LogFn = (arg1: Record<string, unknown> | string, arg2?: unknown, ...args: unknown[]) => void;

export interface AppLogger {
    info: LogFn;
    error: LogFn;
    warn: LogFn;
    debug: LogFn;
    child: (bindings: pino.Bindings) => pino.Logger;
    pino: pino.Logger;
}

// Bridges (msg, data) call pattern to pino's ({data}, msg) convention.
const wrap = (level: 'info' | 'error' | 'warn' | 'debug'): LogFn =>
    (arg1: Record<string, unknown> | string, arg2?: unknown, ...args: unknown[]) => {
        if (typeof arg1 === 'string' && arg2 !== undefined) {
            return baseLogger[level]({ err: arg2, data: args.length > 0 ? args : undefined }, arg1);
        }
        return baseLogger[level](arg1 as Record<string, unknown>, arg2 as string);
    };

export const logger: AppLogger = {
    info: wrap('info'),
    error: wrap('error'),
    warn: wrap('warn'),
    debug: wrap('debug'),
    child: (bindings: pino.Bindings) => baseLogger.child(bindings),
    pino: baseLogger
};

export const log = logger;