diff --git a/src/ExpressHttpApp.ts b/src/ExpressHttpApp.ts index ed7b079d3..35341078f 100644 --- a/src/ExpressHttpApp.ts +++ b/src/ExpressHttpApp.ts @@ -1,4 +1,4 @@ -import { type HttpApp, HttpServerRequest, HttpServerResponse } from '@effect/platform' +import { type HttpApp, HttpMiddleware, HttpServerRequest, HttpServerResponse } from '@effect/platform' import { NodeHttpServerRequest } from '@effect/platform-node' import { Effect } from 'effect' import type { ErrorRequestHandler } from 'express' @@ -22,6 +22,6 @@ export const ExpressHttpApp: HttpApp.Default + Effect.gen(function* () { + const request = yield* HttpServerRequest.HttpServerRequest + const { publicUrl } = yield* ExpressConfig + + const url = new URL(request.url, publicUrl) + + yield* Effect.annotateLogs(Effect.logInfo('Received HTTP request'), { + 'http.method': request.method, + 'http.url': request.url, + 'http.path': url.pathname, + 'http.query': Object.fromEntries(url.searchParams), + 'http.referrer': Option.getOrUndefined(Headers.get(request.headers, 'Referer')), + 'http.userAgent': Option.getOrUndefined(Headers.get(request.headers, 'User-Agent')), + }) + + return yield* app + }), +) + export const Router = pipe( HttpRouter.empty, HttpRouter.get( @@ -68,6 +88,7 @@ export const Router = pipe( Effect.andThen(HttpServerResponse.setHeaders({ 'Cache-Control': 'no-cache, private', Vary: 'Cookie' })), ), ), + HttpRouter.use(logRequest), HttpRouter.get( '/health', Effect.gen(function* () { @@ -97,6 +118,7 @@ export const Router = pipe( return yield* HttpServerResponse.json({ status: 'error' }, { status: StatusCodes.SERVICE_UNAVAILABLE }) }), ), + HttpMiddleware.withLoggerDisabled, ), ), HttpRouter.get('/robots.txt', HttpServerResponse.text('User-agent: *\nAllow: /')),