ILogger 不尊重 Application Insights 的日志级别

rfa*_*fa3 4 c# azure-application-insights .net-core azure-app-service-envrmnt asp.net-core

我一直在尝试使用 ASP.NET Core 2.0 应用程序设置 Application Insights。在本地运行我的应用程序时,日志按预期显示在 Application Insights 中。但是,当部署到 Azure 应用服务时,在将日志发送到 Application Insights 中的“请求”表时,“异常”或“跟踪”中不会显示任何日志。

似乎解决此问题的唯一方法是将以下代码行添加到 Startup.Configure():

            loggerFactory.AddApplicationInsights(app.ApplicationServices, LogLevel.Information);
Run Code Online (Sandbox Code Playgroud)

上面的解决方案是不可取的,因为我们希望根据环境配置不同的日志级别,因此首选基于配置的解决方案。另外,我的猜测是问题与配置有关,因为它在本地工作正常。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);

}
Run Code Online (Sandbox Code Playgroud)

我的 Program.cs 如下:

namespace TestLoggingApplication
{
    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();
    }
}
Run Code Online (Sandbox Code Playgroud)

应用程序的 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"
  }
}
Run Code Online (Sandbox Code Playgroud)

Adr*_*rez 11

自从有人问这个问题以来已经很长时间了,但我也遇到了同样的问题,我不想仅仅为了更改 LogLevel 就需要重新部署。

经过大量研究但没有得到满意的答案,合并来自不同来源的不同用例的信息后,我发现了这个对我有用的解决方案。

您可能需要在 appsettings.json 的“Logging”部分中添加“ApplicationInsights”部分:

"Logging": {
    "LogLevel": {
      "Default": "Information"
    },
    "ApplicationInsights": {
      "LogLevel": {
        "Default": "Information"
      }
    }
  }
Run Code Online (Sandbox Code Playgroud)

这使得它无需更改任何代码即可工作。

  • 谢谢。这就是我一直在寻找的。我的印象是使用通常的日志级别,但似乎没有.. (3认同)
  • 谢谢 - 我在这上面浪费了太多时间。 (3认同)

cij*_*mas 6

更新:此处提供了正确启用日志捕获的新说明。https://docs.microsoft.com/en-us/azure/azure-monitor/app/ilogger

启用日志支持的正确方法是使用loggerFactory.AddApplicationInsights()inConfigure方法。当您从 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);

}
Run Code Online (Sandbox Code Playgroud)

  • 答案解决了这个问题,即如何根据环境改变日志级别,但是如果您想使用配置以便可以根据类别进行更改,该怎么办?例如,OP 的 appsettings.json 在 Information 中记录 Microsoft 和 System 类别,在 Debug 中记录其他所有内容。 (2认同)