private void LogExecutedRequest(LogRequestResponse data, string traceIdentifier) { var message = $"{RESULT_PREFIX} IDENTIFIER: {traceIdentifier} {Environment.NewLine}{RequestLogFormater.FormatExecutedMessage(data)}"; var statusCategory = data.StatusCode / 100; switch (statusCategory) { // StatusCode : 2XX : tout est ok case 2: _logger.LogInformation(message); break; // StatusCode : 4XX : erreur client case 4: _logger.LogWarning(message); break; // StatusCode : 5XX : erreur serveur case 5: _logger.LogError(message); break; // Autre default: goto case 4; } }
public static string FormatExecutedMessage(LogRequestResponse data) { return(string.Join(Environment.NewLine, $"URI: {data.Method} {data.Uri}", $"STATUS CODE: {data.StatusCode}", $"DURATION: {data.Duration}", $"HEADERS: {JsonSerializer.Serialize(data.Headers)}", $"RESPONSE: {data.Body}")); }
public async Task InvokeAsync(HttpContext context) { // CASE : requete qui ne correspondent pas à des controllers // EXAMPLE : affichage de swagger / get qu'une resource (icon, ...) if (!IsValidRequest(context)) { await _next.Invoke(context); return; } var executingData = await CreateExecutingDataAsync(context); var resultData = new LogRequestResponse() { Method = context.Request.Method, Uri = $"{context.Request.Path} {context.Request.QueryString.ToString()}", }; resultData.Body = await context.ReadBodyDuringExecutionAsync(async() => { var sw = new Stopwatch(); sw.Start(); // CASE : execution de la requete await _next.Invoke(context); sw.Stop(); resultData.Duration = sw.Elapsed; }); resultData.Headers = context.Response.Headers; resultData.StatusCode = context.Response.StatusCode; // NOTE : le endpoint est disponible seulement apres l'execution de la requete var endpoint = GetEndpoint(context); // CASE : on ne log pas si l'attribut SkipLog est trouvé // et que la fonctionalité n'est pas dans la config if (endpoint != null) { var skipLogAttribute = endpoint.Metadata.GetMetadata <SkipLogAttribute>(); if (skipLogAttribute != null) { if (!NeedLogFor(skipLogAttribute.FunctionName)) { return; } } } // CASE : Log executing et executed _logger.LogInformation($"{RECEPTION_PREFIX} IDENTIFIER: {context.TraceIdentifier}{Environment.NewLine}{RequestLogFormater.FormatExecutingMessage(executingData)}"); LogExecutedRequest(resultData, context.TraceIdentifier); }