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;
            }
        }
Beispiel #2
0
 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);
        }