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
を作成した場合)、問題なく例外を確認できます。
何が間違っているのかわかりません。誰も助けてもらえますか?
私はついに理解しました。私の問題を解決する方法は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として表示されます。
少し難しい方法:
何らかの理由で、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
に入れると、ApplicationInsightsのConfigureServices
にエラーが表示されなくなります。また、新しいパッケージバージョンにのみ付属する機能である、トレースと例外の両方を表示することを好みます。
あなたの説明によると、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"
}
}
結果:
更新:
レコードは検索機能で見つけます。
Microsoft.Extensions.Logging.ApplicationInsights プロバイダーを使用して、Application Insightsにログを記録できるようになりました。
残念ながら、SDKが更新されて例外テレメトリが起動されるのはごく最近で( commit を参照)、変更はまだ公開されていません。
現在表示されている唯一のルートは、TelemetryClient.TrackException
コード内で、またはILogger
の独自の実装ですべてをラップします-公式SDKがこれをサポートするまでの一時的なソリューションとして