From de69f27877fe151d295ed40e766b72f068896ff0 Mon Sep 17 00:00:00 2001 From: Jesse Wierzbinski Date: Thu, 18 Dec 2025 22:22:03 +0100 Subject: [PATCH] refactor(api): :loud_sound: Move HTTP logs to logtape/hono --- bun.lock | 4 ++++ nix/package.nix | 2 +- package.json | 1 + packages/api/app.ts | 4 ++-- packages/api/middlewares/logger.ts | 26 -------------------------- packages/kit/api.ts | 18 ------------------ packages/logging/index.ts | 6 ++++++ packages/logging/package.json | 1 + utils/server.ts | 3 --- 9 files changed, 15 insertions(+), 50 deletions(-) delete mode 100644 packages/api/middlewares/logger.ts diff --git a/bun.lock b/bun.lock index 27df8056..827fb5fc 100644 --- a/bun.lock +++ b/bun.lock @@ -181,6 +181,7 @@ "version": "0.0.1", "dependencies": { "@logtape/file": "catalog:", + "@logtape/hono": "catalog:", "@logtape/logtape": "catalog:", "@logtape/otel": "catalog:", "@logtape/sentry": "catalog:", @@ -241,6 +242,7 @@ "@hono/standard-validator": "~0.2.1", "@inquirer/confirm": "~6.0.3", "@logtape/file": "~1.3.4", + "@logtape/hono": "~1.3.4", "@logtape/logtape": "~1.3.4", "@logtape/otel": "~1.3.4", "@logtape/sentry": "~1.3.4", @@ -560,6 +562,8 @@ "@logtape/file": ["@logtape/file@1.3.4", "", { "peerDependencies": { "@logtape/logtape": "^1.3.4" } }, "sha512-tIE9T/WR3iqnsacN/el0DdvScNeofpZr54M6AP+Pw7kE7tDOTMnzK2JMd7dcx1mrsF3ZVqUkxToolE70u68blg=="], + "@logtape/hono": ["@logtape/hono@1.3.4", "", { "peerDependencies": { "@logtape/logtape": "^1.3.4", "hono": "^4.0.0" } }, "sha512-+usxX/6b9I6rZaZWPCv/BvI8vdn1rTWeE4JGfwOLKNAVhSuQ/gb0w1r3tRQcCv+Z17jlIVsbqA7qfaBF8V5UTQ=="], + "@logtape/logtape": ["@logtape/logtape@1.3.4", "", {}, "sha512-zFdMXSvyFp3R9FzjxKD9hP+MGdTlOTOutxL9Kg2qLvIUrZ4+q4KvvQC4Zo7LTGWdR2Z5RlzjwSBjyANhsntriw=="], "@logtape/otel": ["@logtape/otel@1.3.4", "", { "dependencies": { "@opentelemetry/api": "^1.9.0", "@opentelemetry/api-logs": "^0.208.0", "@opentelemetry/exporter-logs-otlp-grpc": "^0.208.0", "@opentelemetry/exporter-logs-otlp-http": "^0.208.0", "@opentelemetry/exporter-logs-otlp-proto": "^0.208.0", "@opentelemetry/otlp-exporter-base": "^0.208.0", "@opentelemetry/resources": "^2.2.0", "@opentelemetry/sdk-logs": "^0.208.0", "@opentelemetry/semantic-conventions": "^1.38.0" }, "peerDependencies": { "@logtape/logtape": "^1.3.4" } }, "sha512-88vmByhJ2LYxYdzWtvNxFOAdaVGlwCDpc+8iIQUAB3OmpbvcOot1fRRZcDPg4iA7gLTkYs0pbXb718F/LLafzQ=="], diff --git a/nix/package.nix b/nix/package.nix index b7117f44..0d77b996 100644 --- a/nix/package.nix +++ b/nix/package.nix @@ -54,7 +54,7 @@ in # Required else we get errors that our fixed-output derivation references store paths dontFixup = true; - outputHash = "sha256-Ope/mLjhzNkoU9FIPO+kF4mlnZEqqLHzFvZmnrtvue4="; + outputHash = "sha256-vCqJXbmC03p/4o2p9ou6COEmyPn7znm1LVYJapyexvI="; outputHashAlgo = "sha256"; outputHashMode = "recursive"; }; diff --git a/package.json b/package.json index 81e18963..a5fa20bd 100644 --- a/package.json +++ b/package.json @@ -69,6 +69,7 @@ "@inquirer/confirm": "~6.0.3", "@logtape/file": "~1.3.4", "@logtape/logtape": "~1.3.4", + "@logtape/hono": "~1.3.4", "@logtape/sentry": "~1.3.4", "@logtape/otel": "~1.3.4", "@scalar/hono-api-reference": "~0.9.30", diff --git a/packages/api/app.ts b/packages/api/app.ts index 872d8a9c..4e8fd252 100644 --- a/packages/api/app.ts +++ b/packages/api/app.ts @@ -1,6 +1,7 @@ import { Scalar } from "@scalar/hono-api-reference"; import { config } from "@versia-server/config"; import { ApiError } from "@versia-server/kit"; +import { honoLogger } from "@versia-server/logging"; import { Hono } from "hono"; import { serveStatic } from "hono/bun"; import { cors } from "hono/cors"; @@ -15,7 +16,6 @@ import type { ApiRouteExports, HonoEnv } from "../../types/api.ts"; import { agentBans } from "./middlewares/agent-bans.ts"; import { boundaryCheck } from "./middlewares/boundary-check.ts"; import { ipBans } from "./middlewares/ip-bans.ts"; -import { logger } from "./middlewares/logger.ts"; import { rateLimit } from "./middlewares/rate-limit.ts"; import { routes } from "./routes.ts"; @@ -26,7 +26,7 @@ export const appFactory = async (): Promise> => { app.use(ipBans); app.use(agentBans); - app.use(logger); + app.use(honoLogger); app.use(boundaryCheck); app.use( "/api/*", diff --git a/packages/api/middlewares/logger.ts b/packages/api/middlewares/logger.ts deleted file mode 100644 index 4a310eea..00000000 --- a/packages/api/middlewares/logger.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { serverLogger } from "@versia-server/logging"; -import { SHA256 } from "bun"; -import chalk from "chalk"; -import { createMiddleware } from "hono/factory"; - -export const logger = createMiddleware(async (context, next) => { - const body = await context.req.raw.clone().text(); - - const urlAndMethod = `${chalk.green(context.req.method)} ${chalk.blue(context.req.url)}`; - - const hash = `${chalk.bold("Hash")}: ${chalk.yellow( - new SHA256().update(body).digest("hex"), - )}`; - - const headers = `${chalk.bold("Headers")}:\n${Array.from( - context.req.raw.headers.entries(), - ) - .map(([key, value]) => ` - ${chalk.cyan(key)}: ${chalk.white(value)}`) - .join("\n")}`; - - const bodyLog = `${chalk.bold("Body")}: ${chalk.gray(body)}`; - - serverLogger.debug`${urlAndMethod}\n${hash}\n${headers}\n${bodyLog}`; - - await next(); -}); diff --git a/packages/kit/api.ts b/packages/kit/api.ts index 89e2b2cb..7d576af5 100644 --- a/packages/kit/api.ts +++ b/packages/kit/api.ts @@ -1,9 +1,7 @@ import type { Hook } from "@hono/standard-validator"; import type { RolePermission } from "@versia/client/schemas"; import { config } from "@versia-server/config"; -import { serverLogger } from "@versia-server/logging"; import { extractParams, verifySolution } from "altcha-lib"; -import chalk from "chalk"; import { eq, type SQL } from "drizzle-orm"; import type { Context, Hono, MiddlewareHandler, ValidationTargets } from "hono"; import { every } from "hono/combine"; @@ -417,19 +415,3 @@ export const jsonOrForm = (): MiddlewareHandler => { await next(); }); }; - -export const debugResponse = async (res: Response): Promise => { - const body = await res.clone().text(); - - 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)}`; - - serverLogger.debug`${status}\n${headers}\n${bodyLog}`; -}; diff --git a/packages/logging/index.ts b/packages/logging/index.ts index 62f6b5b2..bf38ad65 100644 --- a/packages/logging/index.ts +++ b/packages/logging/index.ts @@ -1,6 +1,7 @@ import { mkdir } from "node:fs/promises"; import { dirname } from "node:path"; import { getFileSink, getRotatingFileSink } from "@logtape/file"; +import { honoLogger as logtapeHonoLogger } from "@logtape/hono"; import { configure, getConsoleSink, @@ -100,6 +101,7 @@ await configure({ category: "server", sinks: getSinkNames(), }, + { category: ["http"], sinks: getSinkNames() }, { category: ["federation", "inbox"], sinks: getSinkNames(), @@ -148,3 +150,7 @@ export const federationMessagingLogger = getLogger(["federation", "messaging"]); export const databaseLogger = getLogger("database"); export const webfingerLogger = getLogger("webfinger"); export const sonicLogger = getLogger("sonic"); +export const honoLogger = logtapeHonoLogger({ + category: "http", + level: "debug", +}); diff --git a/packages/logging/package.json b/packages/logging/package.json index 4409422b..8ece241e 100644 --- a/packages/logging/package.json +++ b/packages/logging/package.json @@ -18,6 +18,7 @@ "@logtape/file": "catalog:", "@logtape/sentry": "catalog:", "@logtape/otel": "catalog:", + "@logtape/hono": "catalog:", "@sentry/bun": "catalog:", "chalk": "catalog:" } diff --git a/utils/server.ts b/utils/server.ts index db277821..0a4b94b0 100644 --- a/utils/server.ts +++ b/utils/server.ts @@ -1,5 +1,4 @@ import type { ConfigSchema } from "@versia-server/config"; -import { debugResponse } from "@versia-server/kit/api"; import { type Server, serve } from "bun"; import type { Hono } from "hono"; import { matches } from "ip-matching"; @@ -52,8 +51,6 @@ export const createServer = ( const output = await app.fetch(new Request(url, req), { ip }); - await debugResponse(output.clone()); - return output; }, });