ASP.NET Core + ApplicationInsights 将错误记录为跟踪

Posted

技术标签:

【中文标题】ASP.NET Core + ApplicationInsights 将错误记录为跟踪【英文标题】:ASP.NET Core + ApplicationInsights Logging Errors as Trace 【发布时间】:2019-04-04 03:55:21 【问题描述】:

我正在使用 Microsoft.ApplicationInsights.AspNetCore (https://www.nuget.org/packages/Microsoft.ApplicationInsights.AspNetCore)。

我通过在 Programs.cs 和我的启动类中添加 .UseApplicationInsights() 启用了应用程序洞察:

    loggerFactory.AddApplicationInsights(app.ApplicationServices);

这一切都很好,我可以在应用洞察中看到请求,但是当我尝试记录错误时(例如在我的控制器中):

        _logger.LogError("My Error Log");
        _logger.LogError("Test", new Exception("Test"));

两者都被记录为跟踪事件,而不是应用洞察中的异常。

如何让它记录为异常?

【问题讨论】:

【参考方案1】:

如果您想在应用洞察中将错误记录为异常,则应更改这行代码_logger.LogError("Test", new Exception("Test"));

将其更改为_logger.LogError(new Exception(), "test");,这意味着new Exception()应该是第一个参数。

您可以通过右键单击您的项目 -> 添加 -> Application Insights Telemetry 添加应用程序洞察 SDK,这对于自动执行某些操作非常有用(即添加 .UseApplicationInsights() in Programs.cs):

我还发布了我的测试步骤:

1.如上所述添加应用洞察SDK

2.在Startup.cs -> Configure()方法中添加loggerFactory.AddApplicationInsights(app.ApplicationServices,LogLevel.Information);,代码如下:

            public void Configure(IApplicationBuilder app, IHostingEnvironment env,ILoggerFactory loggerFactory)
            
                if (env.IsDevelopment())
                
                    app.UseDeveloperExceptionPage();
                
                else
                
                    app.UseExceptionHandler("/Error");
                    app.UseHsts();
                

                app.UseHttpsRedirection();
                app.UseStaticFiles();
                app.UseCookiePolicy();

                app.UseMvc();

                //Add this line of code
                loggerFactory.AddApplicationInsights(app.ApplicationServices,LogLevel.Information);
            

3.然后在你想记录错误的地方:

        public class AboutModel : PageModel
        
            private ILogger _logger;

            public AboutModel(ILogger<AboutModel> logger)
            
                _logger = logger;
            

            public string Message  get; set; 

            public void OnGet()
            
                _logger.LogInformation("it is just a test herexxxx");

               //Only this format can log as exception
                _logger.LogError(new Exception(), "it is a new Exceptionxxxx");

               //it will log as trace
                _logger.LogError("error logs xxx");
                Message = "Your application description page.";
            
        

4.测试结果如下:

【讨论】:

谢谢,这很有帮助! loggerFactory.AddApplicationInsights(app.ApplicationServices,LogLevel.Information); 现在至少在 .Net 5 上已过时。【参考方案2】:

由于Microsoft.ApplicationInsights.AspNet v2.7 问题和接受的答案已过时,因为在ILoggerFactory 上调用AddApplicationInsights 现在已过时。

请参考the official docs。

文档中的要点:

    ApplicationInsightsLoggerProvider 默认启用。 可以在appsettings.json 中配置捕获的日志类型(如果您确实需要,也可以通过编程方式)
    "Logging": 
        "LogLevel": 
            "Default": "Warning"
        ,
        "ApplicationInsights": 
            "LogLevel": 
                "Default": "Error"
            
        
    

【讨论】:

【参考方案3】:

OP 说:

两者都被记录为跟踪事件,而不是应用洞察中的异常。

我在使用 Serilog 和 ASP.NET Core 3.1 的配置中解决了这个特定问题,遵循了包括上述 Alex Klaus 在内的最新建议。

我的解决方案在此评论中:https://***.com/a/64893138。具体来说,我在 Serilog 部分中没有检测密钥。借助 Application Insights 和 Serilog 部分中的检测密钥,异常开始在 Azure Application Insights 中显示为异常。

【讨论】:

以上是关于ASP.NET Core + ApplicationInsights 将错误记录为跟踪的主要内容,如果未能解决你的问题,请参考以下文章

Asp.Net core (Full .Net framework) vs Asp.Net core (.Net Core) 性能

Asp.NET Core进阶 第四篇 Asp.Net Core Blazor框架

.NET Core 1.0ASP.NET Core 1.0和EF Core 1.0简介

asp.net core 注入后仍然报错?

深入研究 Mini ASP.NET Core(迷你 ASP.NET Core),看看 ASP.NET Core 内部到底是如何运行的

ASP.NET 中的组件许可