-
Notifications
You must be signed in to change notification settings - Fork 0
/
http.logger.ts
38 lines (34 loc) · 1.6 KB
/
http.logger.ts
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
/* eslint-disable sonarjs/no-nested-template-literals */
import { gray, white } from 'colorette';
import pinoHttp, { Options } from 'pino-http';
import { match } from 'ts-pattern';
import { createDetailedConfig } from './detailed.logger';
import { createInlineConfig } from './inline.logger';
import { createJSONConfig } from './json.logger';
import { LogFormat } from './log-format.enum';
import { LogLevel } from './log-level.enum';
import { LoggerOptions } from './logger-options.interface';
import { getColorizer, isErrorResponse, isWarnResponse } from './utils';
export const createHTTPConfig = ({ format, level }: LoggerOptions): Options => ({
customLogLevel: (_req, res) => {
if (isWarnResponse(res)) return LogLevel.WARN;
if (isErrorResponse(res)) return LogLevel.ERROR;
return LogLevel.INFO;
},
wrapSerializers: true,
...match<LogFormat, Options>(format)
.with(LogFormat.INLINE, () => ({
customSuccessMessage: (req, res) =>
`${getColorizer(res)(`(${res.statusCode})`)} ${white(`${req.method} ${req.url}`)} ${gray(
`(${req.socket.remoteAddress}:${req.socket.remotePort})`
)}`,
customErrorMessage: (req, res) =>
`${getColorizer(res)(`(${res.statusCode})`)} ${white(`${req.method} ${req.url} -`)} ${gray(
`(${req.socket.remoteAddress}:${req.socket.remotePort})`
)} ${res.err?.message}`,
...createInlineConfig(level),
}))
.with(LogFormat.DETAILED, () => createDetailedConfig(level))
.otherwise(() => createJSONConfig(level)),
});
export const createHTTPLogger = (options: LoggerOptions) => pinoHttp(createHTTPConfig(options));