评估已配置的日志提供者的LogLevel

我需要在asp.net core 2.0 Web应用程序中记录请求/响应。为此,我们创建了一个RequestLoggingMiddleware(请参见下文)。


该解决方案的缺点在于,将在每个请求中读取主体流。有没有一种方法可以评估是否有针对特定日志级别配置的logprovider。例如,在没有logprovider正在侦听DebugLog-Level的情况下,我们不需要读取主体流。


public class RequestLoggingMiddleware

{

    public ILogger<RequestLoggingMiddleware> Logger { get; }

    public RequestDelegate NextMiddleware { get; }



    public RequestLoggingMiddleware(RequestDelegate nextMiddleware, ILogger<RequestLoggingMiddleware> logger)

    {

        NextMiddleware = nextMiddleware;

        Logger = logger;

    }


    public async Task Invoke(HttpContext context)

    {

        using (MemoryStream loggableResponseStream = new MemoryStream())

        {

            Logger.LogDebug(await FormatRequest(context.Request));


            await NextMiddleware(context);

        }

    }


    private static async Task<string> FormatRequest(HttpRequest request)

    {

        Stream body = request.Body;

        request.EnableRewind();

        byte[] buffer = new byte[Convert.ToInt32(request.ContentLength)];

        await request.Body.ReadAsync(buffer, 0, buffer.Length);

        string bodyAsText = Encoding.UTF8.GetString(buffer);

        request.Body = body;


        var messageObjToLog = new

        {

            scheme = request.Scheme,

            host = request.Host,

            path = request.Path,

            queryString = request.Query,

            requestBody = bodyAsText

        };


        return JsonConvert.SerializeObject(messageObjToLog);

    }


}


慕容708150
浏览 170回答 1
1回答

月关宝盒

ILogger接口的IsEnabled方法定义为:bool IsEnabled(LogLevel logLevel);有没有一种方法可以评估是否有针对特定日志级别配置的logprovider。的默认实现会ILogger保留已配置记录器的集合。IsEnabled方法的实现与您所描述的完全相同:true如果至少一个记录器启用了指定的日志级别,则会枚举所有记录器,并返回所有记录器。github上的Logger源代码因此,以下检查将为您完成这项工作:if (logger.IsEnabled(LogLevel.Debug)){&nbsp; &nbsp; //&nbsp; ...}
打开App,查看更多内容
随时随地看视频慕课网APP