web-dev-qa-db-ja.com

ILoggerFactoryでApplication Insightsを使用する

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を作成した場合)、問題なく例外を確認できます。

何が間違っているのかわかりません。誰も助けてもらえますか?

10
KangarooWest

私はついに理解しました。私の問題を解決する方法は2つあります。

簡単な方法:

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が例外として引数として表示され、例外として表示され、例外のないものは期待どおりTraceとして表示されます。

少し難しい方法:

何らかの理由で、IApplicationBuilderIServiceProviderConfigureは、AddApplicationInsightsで使用する正しいサービスプロバイダーを提供しないため、プロバイダーを追加する必要があります。 ConfigureServices:

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

これは、loggerFactoryへの依存性注入を介して使用できないため、コンストラクターからConfigureServicesをプロパティ/フィールドに保存する必要があることを意味します。

私がやったこと(おそらく私の意見では今のところ最良の解決策):

上記の解決策のいずれかを実行するだけで問題は解決しますが、私は両方を実行することにしました。これは、ConfigureServicesにもエラーを記録できるようにするためです。 loggerFactory.UseApplicationInsightsConfigureに入れると、ApplicationInsightsのConfigureServicesにエラーが表示されなくなります。また、新しいパッケージバージョンにのみ付属する機能である、トレースと例外の両方を表示することを好みます。

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

12
Brando Zhang

Microsoft.Extensions.Logging.ApplicationInsights プロバイダーを使用して、Application Insightsにログを記録できるようになりました。

2
James

残念ながら、SDKが更新されて例外テレメトリが起動されるのはごく最近で( commit を参照)、変更はまだ公開されていません。
現在表示されている唯一のルートは、TelemetryClient.TrackExceptionコード内で、またはILoggerの独自の実装ですべてをラップします-公式SDKがこれをサポートするまでの一時的なソリューションとして

2
EranG