为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
慕容708150 2021-03-30 16:13:29
我需要在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);    }}
查看完整描述

1 回答

?
月关宝盒

TA贡献1772条经验 获得超5个赞

ILogger接口的IsEnabled方法定义为:


bool IsEnabled(LogLevel logLevel);

有没有一种方法可以评估是否有针对特定日志级别配置的logprovider。


的默认实现会ILogger保留已配置记录器的集合。IsEnabled方法的实现与您所描述的完全相同:true如果至少一个记录器启用了指定的日志级别,则会枚举所有记录器,并返回所有记录器。


github上的Logger源代码


因此,以下检查将为您完成这项工作:


if (logger.IsEnabled(LogLevel.Debug))

{

    //  ...

}


查看完整回答
反对 回复 2021-04-10
  • 1 回答
  • 0 关注
  • 143 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信