diff --git a/src/telemetry/requestLogger.ts b/src/telemetry/requestLogger.ts index e4c2a26..041eff7 100644 --- a/src/telemetry/requestLogger.ts +++ b/src/telemetry/requestLogger.ts @@ -10,6 +10,7 @@ import { ConfigurationSchema } from '../config/schema.js'; import { getNodeEnv } from '../env.js'; const LOG_PREFS = Symbol('Logging information'); +const LOGGED_SEMAPHORE = Symbol('Logged semaphore'); interface LogPrefs { start: [number, number]; @@ -57,9 +58,13 @@ function finishLog, error: Error | undefined, req: Request, - res: Response, + res: Response & { [LOGGED_SEMAPHORE]?: boolean }, histogram: Histogram, ) { + if (res[LOGGED_SEMAPHORE]) { + return; + } + const prefs = (res.locals as WithLogPrefs)[LOG_PREFS]; if (prefs.logged) { // This happens when error handler runs, but onEnd hasn't fired yet. We only log the first one. @@ -71,9 +76,22 @@ function finishLog = { ...preInfo, t: 'req', + r: responseType, s: (error as ErrorWithStatus)?.status || res.statusCode || 0, dur, }; @@ -124,6 +142,8 @@ function finishLog finishLog(app, undefined, req, res, histogram); + const logWriter = (err?: Error) => finishLog(app, err, req, res, histogram); res.on('finish', logWriter); + res.on('close', logWriter); + res.on('error', logWriter); next(); }; }