@krainovsd/fastify-logger
Version:
Krainov fastify logger
1 lines • 15 kB
Source Map (JSON)
{"version":3,"file":"index.cjs","sources":["../../src/lib/index.ts","../../src/logger.ts","../../src/define-transport.ts","../../src/define-middlewares.ts"],"sourcesContent":["import { getByPath } from \"@krainovsd/js-helpers\";\nimport { trace } from \"@opentelemetry/api\";\nimport type { FastifyReply, FastifyRequest } from \"fastify\";\nimport { v4 } from \"uuid\";\nimport type { TransportFormat } from \"../logger-types\";\n\nexport function getTraceId() {\n return trace?.getActiveSpan?.()?.spanContext?.()?.traceId ?? undefined;\n}\n\nexport function getErrorInfo(err: unknown, stack: boolean = true) {\n const error = getByPath(err, \"message\") ?? undefined;\n const errorStatus = getByPath(err, \"status\") ?? undefined;\n const errorDescription = getByPath(err, \"description\") ?? undefined;\n const errorStack = stack ? (err instanceof Error ? err.stack : undefined) : undefined;\n\n const traceID = getTraceId();\n\n return { error, errorStatus, errorDescription, errorStack, traceID };\n}\n\nexport function getRequestInfo(req: FastifyRequest) {\n const host = req.ip;\n const url = req.url;\n const method = req.method;\n const traceID = req.traceId ?? getTraceId();\n const operationId = req.operationId ?? v4();\n\n return { host, url, method, traceID, operationId };\n}\n\nexport function getResponseInfo(res: FastifyReply) {\n const status = res?.statusCode ? String(res.statusCode) : null;\n\n return { status };\n}\n\nfunction isHasSpace(str: unknown): str is string {\n return typeof str === \"string\" && str.includes(\" \");\n}\n\nexport function getCorrectLog(\n obj: Record<string, unknown>,\n deniedProperties?: string[],\n format: TransportFormat = \"logfmt\",\n) {\n const correctObj = Object.fromEntries(\n Object.entries(obj).filter(\n ([key, value]) =>\n !(deniedProperties?.includes?.(key.toLowerCase()) || typeof value === \"undefined\"),\n ),\n );\n\n switch (format) {\n case \"logfmt\": {\n let log = \"\";\n\n Object.entries(correctObj).forEach(([key, value]) => {\n if (isHasSpace(value)) {\n value = `\"${value}\"`;\n }\n\n log += `${key}=${value} `;\n });\n // eslint-disable-next-line no-console\n console.log(log.trim());\n break;\n }\n case \"json\": {\n // eslint-disable-next-line no-console\n console.log(correctObj);\n break;\n }\n default: {\n break;\n }\n }\n}\n","import { ResponseError, isBoolean, isObject } from \"@krainovsd/js-helpers\";\nimport type { FastifyBaseLogger } from \"fastify\";\nimport { getErrorInfo } from \"./lib\";\nimport type {\n LoggerErrorOptions,\n LoggerExecuteOptions,\n LoggerInfoOptions,\n LoggerLayerOptions,\n LoggerServiceConstructorOptions,\n LoggerWarnOptions,\n} from \"./logger-types\";\n\nexport class Logger {\n private logger: FastifyBaseLogger;\n\n constructor({ logger }: LoggerServiceConstructorOptions) {\n this.logger = logger;\n }\n\n async loggerLayer<T>({\n action,\n processData,\n loggerExecute = { error: true, start: false, stop: false },\n loggerMessage,\n loggerInfo,\n }: LoggerLayerOptions<T>) {\n try {\n if (this.isHasLoggerAction(loggerExecute, \"start\"))\n this.debug({ info: loggerInfo, message: `start ${loggerMessage}` });\n\n const data = await action();\n const processingData = processData ? await processData(data) : data;\n\n if (this.isHasLoggerAction(loggerExecute, \"stop\"))\n this.debug({ info: loggerInfo, message: `stop ${loggerMessage}` });\n\n return processingData as T;\n } catch (error) {\n if (this.isHasLoggerAction(loggerExecute, \"error\"))\n this.warn({ info: loggerInfo, error, message: `error ${loggerMessage}` });\n\n throw error;\n }\n }\n\n async controllerLayer<T = unknown>(\n action: () => Promise<T>,\n logger: boolean = true,\n ): Promise<\n | { data: T; status: 200; success: true }\n | { data: { message: string }; status: number; success: false }\n > {\n try {\n const result = await action();\n\n return {\n data: result,\n status: 200,\n success: true,\n };\n } catch (error) {\n if (logger) this.error({ error });\n\n if (error instanceof ResponseError) {\n return { data: { message: error.message }, status: error.status, success: false };\n }\n\n throw error;\n }\n }\n\n debug({ info = {}, message = \"debug\" }: LoggerInfoOptions) {\n this.logger.debug(info, message);\n }\n\n info({ info = {}, message = \"info\" }: LoggerInfoOptions) {\n this.logger.info(info, message);\n }\n\n warn({ info = {}, message = \"warn\", error }: LoggerWarnOptions) {\n const errorInfo = getErrorInfo(error, false);\n this.logger.warn({ ...errorInfo, ...info }, message);\n }\n\n error({ error, info = {}, message = \"error\" }: LoggerErrorOptions) {\n const errorInfo = getErrorInfo(error);\n this.logger.error({ ...errorInfo, ...info }, message);\n }\n\n private isHasLoggerAction(\n options: LoggerExecuteOptions | boolean | undefined,\n action: keyof LoggerExecuteOptions,\n ) {\n if (isBoolean(options)) return options;\n if (isObject(options)) return Boolean(options[action]);\n\n return false;\n }\n}\n","import type { PinoLoggerOptions } from \"fastify/types/logger\";\nimport { join } from \"path\";\nimport type { TransportSettings } from \"./logger-types\";\n\nexport function defineTransport(\n settings: TransportSettings & { ext?: string } = {},\n): PinoLoggerOptions[\"transport\"] {\n const { ext = \".cjs\", ...rest } = settings;\n\n return {\n target: getTransportPath(ext),\n options: {\n ...rest,\n },\n };\n}\n\nfunction getTransportPath(ext: string) {\n return join(__dirname, `./transport.${ext.replace(/^./, \"\")}`);\n}\n","import type { FastifyInstance } from \"fastify\";\nimport { getRequestInfo, getResponseInfo } from \"./lib\";\nimport { Logger } from \"./logger\";\nimport type { DefineMiddlewareSettings } from \"./logger-types\";\n\nexport function defineMiddlewares(\n fastify: FastifyInstance,\n settings: DefineMiddlewareSettings = {},\n) {\n const logger = new Logger({ logger: fastify.log });\n\n fastify.setErrorHandler(function onError(error, request, reply) {\n const status = error.statusCode ?? 500;\n if (\n status === 500 &&\n (settings.errorLogFilter == undefined || settings.errorLogFilter(request))\n ) {\n const requestInfo = getRequestInfo(request);\n logger.error({ error, info: requestInfo, message: \"error\" });\n }\n\n settings.onError?.(error, request, reply);\n\n reply\n .status(status)\n .header(\"traceId\", request.traceId)\n .header(\"operationId\", request.operationId)\n .send({\n traceId: request.traceId,\n operationId: request.operationId,\n message: error.message,\n });\n });\n\n fastify.addHook(\"onRequest\", function onRequest(request, reply, done) {\n if (settings.accessLogFilter != undefined && !settings.accessLogFilter(request)) {\n done();\n\n return;\n }\n\n const requestInfo = getRequestInfo(request);\n request.traceId = requestInfo.traceID;\n request.operationId = requestInfo.operationId;\n logger.info({ info: requestInfo, message: \"receive request\" });\n\n settings.onRequest?.(request, reply);\n\n done();\n });\n fastify.addHook(\"onSend\", async function onSend(request, reply, payload) {\n reply.header(\"traceId\", request.traceId);\n reply.header(\"operationId\", request.operationId);\n\n await settings.onSend?.(request, reply, payload);\n\n return payload;\n });\n fastify.addHook(\"onResponse\", function onResponse(request, reply, done) {\n if (settings.accessLogFilter != undefined && !settings.accessLogFilter(request)) {\n done();\n\n return;\n }\n\n const requestInfo = getRequestInfo(request);\n const responseInfo = getResponseInfo(reply);\n\n settings.onResponse?.(request, reply);\n\n logger.info({\n info: {\n ...requestInfo,\n ...responseInfo,\n },\n message: \"send response\",\n });\n\n done();\n });\n}\n"],"names":["trace","getByPath","v4","ResponseError","isBoolean","isObject","join"],"mappings":"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"}