logs para averiaguar el fallo de subida de archivos desde la app

This commit is contained in:
abiandev
2026-07-29 12:59:29 +02:00
parent 73c1416f7a
commit c093c3f7c2
6 changed files with 219 additions and 25 deletions
+70
View File
@@ -55,6 +55,76 @@ app.use((req, res, next) => {
contentType.toLowerCase().startsWith('multipart/form-data');
if (isMultipartFormData) {
const startedAt = process.hrtime.bigint();
const baseLogPayload = {
request_id: requestId,
method: req.method,
path: req.originalUrl || req.url,
ip: req.ip || null,
content_type: contentType,
content_length: Number.parseInt(req.get('content-length'), 10) || null,
has_authorization_header: Boolean(authorizationHeader),
user_agent: String(req.get('user-agent') || '').slice(0, 255) || null
};
let responseFinished = false;
appendPostLog({
event: 'upload_request_started',
...baseLogPayload
});
res.once('finish', () => {
responseFinished = true;
const parserStatus = req.uploadDiagnostics?.parser_status || 'not_reached';
let failureStage = null;
if (res.statusCode >= 400) {
if (parserStatus === 'rejected') {
failureStage = 'multipart_parser';
} else if (parserStatus === 'parsed') {
failureStage = 'controller_or_persistence';
} else {
failureStage = 'authentication_rate_limit_or_route';
}
}
appendPostLog({
event: 'upload_request_finished',
...baseLogPayload,
status_code: res.statusCode,
duration_ms: Number(
(Number(process.hrtime.bigint() - startedAt) / 1e6).toFixed(2)
),
request_complete: req.complete,
outcome: res.statusCode < 400 ? 'success' : 'error',
failure_stage: failureStage,
upload: req.uploadDiagnostics || {
parser_status: 'not_reached'
}
});
});
res.once('close', () => {
if (responseFinished) {
return;
}
appendPostLog({
event: 'upload_request_interrupted',
...baseLogPayload,
status_code: res.statusCode,
duration_ms: Number(
(Number(process.hrtime.bigint() - startedAt) / 1e6).toFixed(2)
),
request_complete: req.complete,
outcome: 'interrupted',
failure_stage: 'transport_or_client_disconnect',
upload: req.uploadDiagnostics || {
parser_status: 'not_reached'
}
});
});
return next();
}