在我们的生产环境中,我们有一个负载均衡的.net核心Web服务,因此负载均衡器每秒调用一个特殊/健康URL来检查服务是否仍在运行。当loglevel设置为Info时,由于这些重复调用,日志文件会快速填充。看到有问题的日志来自.net核心框架,我无法看到如何在不过滤掉所有请求的情况下过滤掉这些请求。此类请求的日志示例如下:
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
Request starting HTTP/1.1 GET http://localhost:5555/Health
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[2]
Request finished in 1674.6082ms 200
知道如何在不过滤掉所有其他请求的情况下过滤掉这些内容吗?
答案 0 :(得分:0)
是的,您可以设置最低级别的日志记录,它只会记录此级别及更高级别的事件。日志级别优先级为:
我个人使用Error
级别仅记录错误和关键问题,我这样做:
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Error() // <--- this sets the minimum level
.WriteTo.RollingFile(new JsonFormatter(renderMessage: true),
Path.Combine(env.ContentRootPath, "myLog.txt"))
.CreateLogger();
答案 1 :(得分:0)
另一种选择是仅过滤特定类别。
<强> appsettings.json:强>
{
"Logging": {
"IncludeScopes": false,
"Debug": {
"LogLevel": {
"Default": "Warning"
}
},
"Console": {
"LogLevel": {
"Microsoft.AspNetCore.Hosting.Internal.WebHost": "Warning",
"Default": "Info"
}
}
}
}
the docs中有更多信息,请查看&#34;日志过滤&#34;部分。
答案 2 :(得分:0)
我设法使用依赖项注入来覆盖默认的 ILoggerProvider
,它可以为 Microsoft.AspNetCore.Hosting.Diagnostics 类别注入我自己的自定义 ILogger
,并跳过记录来自我的健康检查端点。这可以过滤掉“请求开始”事件,但“请求完成”事件使用的对象将请求的路径隐藏在私有字段中。我在使用反射检查请求的路径时画了一条线,结果是这样的:
app.Use(async (context, next) =>
{
if (context.Request.Path != "/api/v1/liveness")
{
Console.WriteLine($"info: Microsoft.AspNetCore.Hosting.Diagnostics[1]");
Console.WriteLine($" Request starting {context.Request.Protocol} {context.Request.Method} {context.Request.Scheme}://{context.Request.Host}{context.Request.Path} {context.Request.ContentLength ?? 0}");
var sw = Stopwatch.StartNew();
await next.Invoke();
Console.WriteLine($"info: Microsoft.AspNetCore.Hosting.Diagnostics[2]");
Console.WriteLine($" Request finished in {sw.Elapsed.TotalMilliseconds}ms {context.Response.StatusCode}");
}
else
{
// liveness probe logic
}
})
它完成了工作,因为在我的 appsettings.json 中,我已将该类别的日志级别设置为警告:
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore.Hosting.Diagnostics": "Warning"
}
}