diff --git a/config/config.schema.json b/config/config.schema.json index 613f1076..2fb6a6f4 100644 --- a/config/config.schema.json +++ b/config/config.schema.json @@ -3848,6 +3848,10 @@ "type": "boolean", "default": false }, + "log_responses": { + "type": "boolean", + "default": false + }, "log_requests_verbose": { "type": "boolean", "default": false @@ -3941,6 +3945,7 @@ "additionalProperties": false, "default": { "log_requests": false, + "log_responses": false, "log_requests_verbose": false, "log_level": "info", "log_ip": false, diff --git a/packages/config-manager/config.type.ts b/packages/config-manager/config.type.ts index 5b41543b..02629358 100644 --- a/packages/config-manager/config.type.ts +++ b/packages/config-manager/config.type.ts @@ -567,6 +567,7 @@ export const configValidator = z.object({ logging: z .object({ log_requests: z.boolean().default(false), + log_responses: z.boolean().default(false), log_requests_verbose: z.boolean().default(false), log_level: z .enum(["debug", "info", "warning", "error", "fatal"]) @@ -605,6 +606,7 @@ export const configValidator = z.object({ }) .default({ log_requests: false, + log_responses: false, log_requests_verbose: false, log_level: "info", log_ip: false, diff --git a/utils/api.ts b/utils/api.ts index 53491469..5ecc9b19 100644 --- a/utils/api.ts +++ b/utils/api.ts @@ -458,3 +458,24 @@ export const debugRequest = async (req: Request) => { logger.debug`${urlAndMethod}`; } }; + +export const debugResponse = async (res: Response) => { + const body = await res.clone().text(); + const logger = getLogger("server"); + + const status = `${chalk.bold("Status")}: ${chalk.green(res.status)}`; + + const headers = `${chalk.bold("Headers")}:\n${Array.from( + res.headers.entries(), + ) + .map(([key, value]) => ` - ${chalk.cyan(key)}: ${chalk.white(value)}`) + .join("\n")}`; + + const bodyLog = `${chalk.bold("Body")}: ${chalk.gray(body)}`; + + if (config.logging.log_requests_verbose) { + logger.debug`${status}\n${headers}\n${bodyLog}`; + } else { + logger.debug`${status}`; + } +}; diff --git a/utils/server.ts b/utils/server.ts index 6296f74f..6ef50cc2 100644 --- a/utils/server.ts +++ b/utils/server.ts @@ -1,6 +1,7 @@ import type { OpenAPIHono } from "@hono/zod-openapi"; import type { Config } from "~/packages/config-manager/config.type"; import type { HonoEnv } from "~/types/api"; +import { debugResponse } from "./api"; export const createServer = (config: Config, app: OpenAPIHono) => Bun.serve({ @@ -17,7 +18,13 @@ export const createServer = (config: Config, app: OpenAPIHono) => } : undefined, hostname: config.http.bind || "0.0.0.0", // defaults to "0.0.0.0" - fetch(req, server) { - return app.fetch(req, { ip: server.requestIP(req) }); + async fetch(req, server) { + const output = await app.fetch(req, { ip: server.requestIP(req) }); + + if (config.logging.log_responses) { + await debugResponse(output.clone()); + } + + return output; }, });