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;
|