ILogger不尊重应用洞察的日志级别

8
我一直在尝试在ASP.NET Core 2.0应用程序中设置Application Insights。当我在本地运行应用程序时,日志按预期显示在Application Insights中。但是,当部署到Azure应用服务时,虽然日志被发送到Application Insights的“请求”表中,但没有日志显示在“异常”或“跟踪”中。
唯一似乎解决这个问题的方法是将下面这行代码添加到Startup.Configure()中:
loggerFactory.AddApplicationInsights(app.ApplicationServices, LogLevel.Information);

上述解决方案不理想,因为我们希望通过环境来配置日志级别,所以最好采用基于配置的解决方案。此外,我猜测问题与配置相关,因为在本地正常工作,Azure中没有进行任何特殊配置。
以下是完整的Startup.Configure():
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    app.UseMvc();

    loggerFactory.AddApplicationInsights(app.ApplicationServices, LogLevel.Information);
}

我的Program.cs代码如下:
public class Program
{
    public static void Main(string[] args)
    {
        BuildWebHost(args).Run();
    }
    
    public static IWebHost BuildWebHost(string[] args) => WebHost
        .CreateDefaultBuilder(args)
        .UseApplicationInsights()
        .UseStartup<Startup>()
        .Build();
}

appsettings.json(InstrumentationKey已更改以保护隐私):

{
    "Logging": {
        "IncludeScopes": false,
        "Debug": {
            "LogLevel": {
                "Default": "Debug"
            }
        },
        "Console": {
            "LogLevel": {
                "Default": "Debug"
            }
        },
        "LogLevel": {
            "Default": "Debug",
            "System": "Information",
            "Microsoft": "Information"
        }
    },
    "ApplicationInsights": {
        "InstrumentationKey": "00000000-0000-0000-0000-000000000000"
    }
}
2个回答

11

虽然这个问题已经有一段时间了,但我也遇到了同样的问题,我不想重新部署应用程序就能更改日志级别。

在进行了许多研究而没有找到令人满意的答案后,我从不同的信息来源中整合了各种用例,并找到了适合我的解决方案。

您可能需要在appsettings.json文件的“Logging”部分内添加一个“ApplicationInsights”部分:

"Logging": {
    "LogLevel": {
      "Default": "Information"
    },
    "ApplicationInsights": {
      "LogLevel": {
        "Default": "Information"
      }
    }
  }

这使得它可以不需要任何代码更改而正常工作。


3
谢谢。这正是我一直在寻找的。我原本以为通常使用的日志级别被使用了,但似乎并不是这样。 - Alex
3
谢谢 - 我在这上面浪费了太多时间。 - kra
1
我不明白为什么sink会重写日志级别...这没有意义。不管怎样,谢谢,它有效。 - Alamakanambra

7
更新:正确启用日志记录的新说明在此处。 https://learn.microsoft.com/en-us/azure/azure-monitor/app/ilogger 正确启用日志记录支持的方法是在Configure方法中使用loggerFactory.AddApplicationInsights()。当您从Visual Studio运行时,您不需要这一行,因为VS会在幕后为您完成。但是,当您在VS之外运行时,它将无法工作,请添加loggerFactory.AddApplicationInsights方法。https://github.com/Microsoft/ApplicationInsights-aspnetcore/wiki/Logging 要根据环境获取不同的日志级别,请在条件语句内使用以下代码行。像下面的示例一样。
if(env.IsDeveleopment())
{
   loggerFactory.AddApplicationInsights(app.ApplicationServices, LogLevel.Debug);
}
else if(env.IsPreProduction())
{
   loggerFactory.AddApplicationInsights(app.ApplicationServices, LogLevel.Verbose);

}
else
{
   loggerFactory.AddApplicationInsights(app.ApplicationServices, LogLevel.Warning);

}

8
回答针对问题,即如何根据环境变化日志级别,但如果您想使用配置以便按类别变化呢?例如,OP的appsettings.json日志记录Microsoft和System类别为Information,而其他所有内容为Debug。 - tdykstra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接