it-roy-ru.com

Использование Application Insights с ILoggerFactory

Я пытаюсь зарегистрировать исключения в Application Insights. Мне удалось это сделать, вызвав TelemetryClient.TrackException напрямую. Тем не менее, я хотел бы абстрагироваться от этого в моем коде на случай, если в будущем я захочу войти на другие платформы, поэтому я хотел бы придерживаться только интерфейса ILogger.

Я обнаружил, что вы можете использовать ILoggerFactory.AddApplicationInsights (как реализовано здесь ), но независимо от того, что я сделал, я не вижу журналы, отображаемые в 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" );
    }

Однако я не вижу никаких исключений, связанных с запросом. Если я заменим строку Logger.LogError на TelemetryClient.TrackException (и сначала создам TelemetryClient), то я смогу увидеть исключение без каких-либо проблем. 

Я не знаю, что я делаю не так. Может ли кто-нибудь помочь? 

8
KangarooWest

Я наконец разобрался. Есть два способа решить мою проблему:

Простой способ:

Я использовал более старые версии Application Insights NuGets. В частности, Microsoft.ApplicationInsights.2.2.0 и Microsoft.ApplicationInsights.AspNetCore.2.0.0.

Как только я обновляю до Microsoft.ApplicationInsights.2.4.0 и Microsoft.ApplicationInsights.AspNetCore.2.1.1, все работает как положено. Вы также видите LogXXX с исключением в качестве аргумента, который отображается как Исключение, и один без исключения, который отображается как Трассировка, как и ожидалось.

Чуть сложнее:

По некоторым причинам IApplicationBuilder и IServiceProvider в Configure не предоставляют правильного поставщика услуг для использования в 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, я бы не смог увидеть ошибку в ConfigureServices на ApplicationInsights. Я также предпочитаю видеть и трассировки, и исключения, функцию, которая поставляется только с новой версией пакета.

3
KangarooWest

Согласно вашему описанию, я предлагаю вам попробовать следующие коды, чтобы 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"
  }
}

Результат:

 enter image description here

 enter image description here


Обновление:

Запись найти в функции поиска.

 enter image description here

8
Brando Zhang

К сожалению, SDK был обновлен для запуска исключительной телеметрии только недавно (см. commit ), и изменение еще не было опубликовано.
Единственные маршруты, которые я вижу сейчас, - это оставить явный вызов TelemetryClient.TrackException в вашем коде или обернуть все это своей собственной реализацией ILogger - как временные решения, пока официальный SDK не поддержит это.

2
EranG