Using Application Insights with ILoggerFactory

There is now first-class support for logging to Application Insights, using the Microsoft.Extensions.Logging.ApplicationInsights provider.


I finally figured out. There are two ways to solve my issue:

Easy way:

I was using older versions of the Application Insights NuGets. Specifically, Microsoft.ApplicationInsights.2.2.0 and Microsoft.ApplicationInsights.AspNetCore.2.0.0.

Once I upgrade to Microsoft.ApplicationInsights.2.4.0 and Microsoft.ApplicationInsights.AspNetCore.2.1.1, everything works as expected. You also see the LogXXX with an exception as an argument showing up as Exception, and one without an exception showing up as Trace as expected.

Slightly more difficult way:

For some reason, the IApplicationBuilder and IServiceProvider in Configure does not provide the correct service provider to use in AddApplicationInsights, so you need to add the provider in the ConfigureServices:

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

This means that you need to save the loggerFactory from the constructor into a property/field since it's not available via dependency injection in ConfigureServices.

What I ended up doing (probably the best solution for now in my opinion):

Even though just doing either of the solutions above solves the problem, I decided to do both. This is because I want to be able to log error in ConfigureServices as well. Were I to put loggerFactory.UseApplicationInsights in Configure, then I would not be able to see the error in ConfigureServices on ApplicationInsights. I also prefer to see both Traces and Exceptions, a feature that only comes with the new package version.


According to your description, I suggest you could try below codes to enable ILogger log the error to the ApplicationInsights.

You could directly use loggerFactory.AddApplicationInsights() method to enable the ApplicationInsights ILogger.

More details, you could refer to below codes:

The startup class:

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?}");
        });
    }
}

The appsettings.json:

{

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

Result:

enter image description here

enter image description here


Update:

The record find in the search feature.

enter image description here