【问题标题】:Using Application Insights with ILoggerFactory将 Application Insights 与 ILoggerFactory 结合使用
【发布时间】:2017-07-10 22:36:53
【问题描述】:

我正在尝试将异常记录到 Application Insights。我通过直接调用TelemetryClient.TrackException 成功地做到了这一点。但是,我想在我的代码中对此进行抽象,以防将来我想登录到其他平台,所以我想只坚持 ILogger 接口。

我发现您可以使用ILoggerFactory.AddApplicationInsights(已实现here),但无论我做什么,我都看不到ApplicationInsights 中显示的日志。

下面是我的代码:

Startup.cs

    IConfigurationRoot Configuration { get; set; }
    ILoggerFactory LoggerFactory { get; set; }
    IServiceProvider ServiceProvider { get; set; }

    public Startup( IHostingEnvironment hostingEnvironment, ILoggerFactory loggerFactory )
    {
        this.LoggerFactory = loggerFactory;
        string configurationFilePath = "abc.json";

        this.Configuration = new ConfigurationBuilder()
            .SetBasePath( hostingEnvironment.ContentRootPath )
            .AddJsonFile( configurationFilePath, optional: true, reloadOnChange: true )
            .AddEnvironmentVariables()
            .Build();
    }

    public void Configure(
        IApplicationBuilder applicationBuilder,
        IHostingEnvironment hostingEnvironment,
        ILoggerFactory loggerFactory,
        IServiceProvider serviceProvider )
    {
        this.ServiceProvider = serviceProvider;
        loggerFactory.AddApplicationInsights( serviceProvider );
        applicationBuilder.UseMvc();
    }

    public void ConfigureServices( IServiceCollection services )
    {
        services.AddApplicationInsightsTelemetry( this.Configuration );
        services.AddMvc( .... // A bunch of options here ... )
    }

然后,我尝试像这样在我的控制器中使用它:

    ILogger<XController> Logger { get; set; }

    public XController( ILogger<XController> logger )
    {
        this.Logger = logger;
    }

    [HttpPost]
    [Route( "v3.0/abcd" )]
    public async Task PostEvent( [FromBody] XEvent xEvent )
    {
        this.Logger.LogError( 0, new Exception( "1234" ), "1234" );
    }

但是,我根本没有看到与该请求相关的任何异常。如果我用TelemetryClient.TrackException 替换Logger.LogError 行(并首先创建TelemetryClient),那么我可以毫无问题地看到异常。

我不知道我做错了什么。有人可以帮忙吗?

【问题讨论】:

    标签: c# logging asp.net-core azure-web-app-service azure-application-insights


    【解决方案1】:

    根据您的描述,我建议您可以尝试以下代码来启用 ILogger 将错误记录到 ApplicationInsights。

    您可以直接使用 loggerFactory.AddApplicationInsights() 方法来启用 ApplicationInsights ILogger。

    更多细节,您可以参考以下代码:

    启动类:

    public class Startup
    {
        public Startup(IHostingEnvironment env)
        {
            var builder = new ConfigurationBuilder()
                .SetBasePath(env.ContentRootPath)
                .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
                .AddEnvironmentVariables();
            Configuration = builder.Build();
        }
    
        public IConfigurationRoot Configuration { get; }
    
        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddApplicationInsightsTelemetry(Configuration);
            // Add framework services.
            services.AddMvc();
        }
    
        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
        {
    
            loggerFactory.AddApplicationInsights(app.ApplicationServices,LogLevel.Warning);
    
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
                app.UseBrowserLink();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
            }
    
            app.UseStaticFiles();
    
            app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "default",
                    template: "{controller=Home}/{action=Index}/{id?}");
            });
        }
    }
    

    appsettings.json:

    {
    
      "ApplicationInsights": {
        "InstrumentationKey": "yourkey"
      }
    }
    

    结果:


    更新:

    在搜索功能中找到的记录。

    【讨论】:

    • 谢谢。但是,我尝试了这个,它仍然没有用。只是为了确保我尝试了正确的事情-您的答案与我已经在问题中发布的内容有何不同,以便我可以进行正确的编辑?另外,如果有帮助,1)我尝试添加 AddAzureWebAppDiagnostics() 并且我可以看到日志流,所以我认为我正确使用了 Logger。 2)我可以直接使用TrackException并在ApplicationInsights上查看结果,所以我认为我正确设置了appSettings.json。这就是为什么我很困惑事情仍然不起作用的原因:|
    • 我建议你可以重新检查一下你的 AI 记录。据我所知,log.error的意思是在AI中添加trace记录,所以你不会在失败中找到记录,你可以在trace记录中找到。我建议您可以从我的更新答案显示的搜索按钮(在 AI 门户中)重新检查记录。
    • 感谢白兰度的建议。我最终弄清楚了这些问题。我的猜测是我们的代码使用了不同版本的 NuGet 包,这些包的发展非常迅速,因此出现了不同的行为。
    • @BrandoZhang 但真正的问题是.....如何使用 ilogger 为核心 2.0 控制台应用启用 Application Insights :)?
    • loggerFactory.AddApplicationInsights
    【解决方案2】:

    现在使用Microsoft.Extensions.Logging.ApplicationInsights 提供程序对记录到 Application Insights 提供一流的支持。

    【讨论】:

    • 这应该是开箱即用的,但我似乎遗漏了一些东西,因为它没有记录跟踪。以下内容是否足够? services.AddApplicationInsightsTelemetry();
    • 您可能需要检查您的日志级别过滤器,默认过滤掉所有比信息级别更“详细”的消息。
    • 我执行以下操作时的事件:` _logger.LogTrace("Logging trace"); _logger.LogDebug("日志调试"); _logger.LogInformation("记录信息"); _logger.LogWarning("记录警告"); _logger.LogError("记录错误"); _logger.LogCritical("记录关键"); ` 我可以在控制台上看到输出,但在 AI 跟踪中什么也看不到
    • 您是否设法解决了这个问题@tonycdp?同样的问题,没有任何帮助。
    • @Piedone 是的,这是一个配置问题。从头开始设置一个虚拟应用程序,然后与你所拥有的进行比较。很抱歉,因为已经有一段时间了,我无法为您提供更多帮助。
    【解决方案3】:

    我终于想通了。有两种方法可以解决我的问题:

    简单的方法:

    我使用的是旧版本的 Application Insights NuGet。具体来说, Microsoft.ApplicationInsights.2.2.0Microsoft.ApplicationInsights.AspNetCore.2.0.0

    一旦我升级到 Microsoft.ApplicationInsights.2.4.0Microsoft.ApplicationInsights.AspNetCore.2.1.1,一切正常。您还会看到 LogXXX 带有异常作为参数显示为 Exception,而没有异常的参数显示为 Trace。

    稍微困难的方法:

    由于某种原因,Configure 中的IApplicationBuilderIServiceProvider 没有提供正确的服务提供者在AddApplicationInsights 中使用,因此您需要在ConfigureServices 中添加提供者:

        public void ConfigureServices( IServiceCollection services )
        {
                IServiceProvider serviceProvider = services.BuildServiceProvider();
                this.LoggerFactory.AddApplicationInsights( serviceProvider, Extensions.Logging.LogLevel.Information );
                ...
        }
    

    这意味着您需要将构造函数中的loggerFactory 保存到属性/字段中,因为它不能通过ConfigureServices 中的依赖注入获得。

    我最终做了什么(在我看来可能是目前最好的解决方案):

    即使只执行上述任一解决方案都可以解决问题,但我还是决定同时执行。这是因为我也希望能够在ConfigureServices 中记录错误。如果我将loggerFactory.UseApplicationInsights 放入Configure,那么我将无法在ApplicationInsights 上看到ConfigureServices 中的错误。我也更喜欢同时查看 Traces 和 Exceptions,这是仅在新包版本中提供的功能。

    【讨论】:

      【解决方案4】:

      不幸的是,SDK 仅在最近才更新为触发异常遥测(请参阅 commit),并且尚未发布更改。
      我现在看到的唯一路线是在您的代码中保留对TelemetryClient.TrackException 的显式调用,或者用您自己的ILogger 实现将其全部包装——这两种方法都作为临时解决方案,直到官方SDK 支持这一点

      【讨论】:

      • 谢谢。从提交来看,它看起来会在出现异常时触发 ExceptionTelemetry,否则会触发 TraceTelemetry。这也是我在代码中进行测试的时候。您是否建议他们稍后删除 TraceTelemetry?
      • 我的意思是,在当前的 SDK 中,它们仅用于 TraceTelemetry。 SDK 的未来版本中将提供触发 ExceptionTelemetry 的功能
      【解决方案5】:

      这是带有 ILogger 的 App Insights 的 documentation。对我来说它有效,但是有大量的跟踪日志,所以建议你应用自定义过滤器:

      builder.AddApplicationInsights("ikey");
      
      builder.AddFilter<Microsoft.Extensions.Logging.ApplicationInsights.ApplicationInsightsLoggerProvider>
                  ("", LogLevel.Information);
      builder.AddFilter<Microsoft.Extensions.Logging.ApplicationInsights.ApplicationInsightsLoggerProvider>
                  ("Microsoft", LogLevel.Warning);
      

      【讨论】:

        猜你喜欢
        • 2019-07-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-18
        相关资源
        最近更新 更多