我需要在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))
{
// ...
}
- 1 回答
- 0 关注
- 169 浏览
添加回答
举报
0/150
提交
取消