@@ -10,6 +10,7 @@ import { ConfigurationSchema } from '../config/schema.js';
10
10
import { getNodeEnv } from '../env.js' ;
11
11
12
12
const LOG_PREFS = Symbol ( 'Logging information' ) ;
13
+ const LOGGED_SEMAPHORE = Symbol ( 'Logged semaphore' ) ;
13
14
14
15
interface LogPrefs {
15
16
start : [ number , number ] ;
@@ -57,9 +58,13 @@ function finishLog<SLocals extends AnyServiceLocals = ServiceLocals<Configuratio
57
58
app : ServiceExpress < SLocals > ,
58
59
error : Error | undefined ,
59
60
req : Request ,
60
- res : Response ,
61
+ res : Response & { [ LOGGED_SEMAPHORE ] ?: boolean } ,
61
62
histogram : Histogram ,
62
63
) {
64
+ if ( res [ LOGGED_SEMAPHORE ] ) {
65
+ return ;
66
+ }
67
+
63
68
const prefs = ( res . locals as WithLogPrefs ) [ LOG_PREFS ] ;
64
69
if ( prefs . logged ) {
65
70
// This happens when error handler runs, but onEnd hasn't fired yet. We only log the first one.
@@ -74,6 +79,8 @@ function finishLog<SLocals extends AnyServiceLocals = ServiceLocals<Configuratio
74
79
const endLog : Record < string , string | string [ ] | number | undefined > = {
75
80
...preInfo ,
76
81
t : 'req' ,
82
+ // ts warning is known and incorrect—`aborted` is a subset of `destroyed``
83
+ r : req . aborted ? 'aborted' : req . destroyed ? 'destroyed' : error ? 'errored' : 'finished' ,
77
84
s : ( error as ErrorWithStatus ) ?. status || res . statusCode || 0 ,
78
85
dur,
79
86
} ;
@@ -124,6 +131,8 @@ function finishLog<SLocals extends AnyServiceLocals = ServiceLocals<Configuratio
124
131
} else {
125
132
logger . info ( endLog , msg ) ;
126
133
}
134
+
135
+ res [ LOGGED_SEMAPHORE ] = true ;
127
136
}
128
137
129
138
export function loggerMiddleware <
@@ -180,8 +189,10 @@ export function loggerMiddleware<
180
189
logger . info ( preLog , msg ) ;
181
190
}
182
191
183
- const logWriter = ( ) => finishLog ( app , undefined , req , res , histogram ) ;
192
+ const logWriter = ( err ?: Error ) => finishLog ( app , err , req , res , histogram ) ;
184
193
res . on ( 'finish' , logWriter ) ;
194
+ res . on ( 'close' , logWriter ) ;
195
+ res . on ( 'error' , logWriter ) ;
185
196
next ( ) ;
186
197
} ;
187
198
}
0 commit comments