J'essaie de consigner les exceptions dans Application Insights. J'ai réussi à le faire en appelant directement TelemetryClient.TrackException
. Cependant, je voudrais faire abstraction de cela dans mon code au cas où je souhaiterais me connecter à d'autres plates-formes à l'avenir, c'est pourquoi je ne souhaite m'en tenir qu'à l'interface ILogger.
J'ai découvert que vous pouvez utiliser ILoggerFactory.AddApplicationInsights
(tel que mis en œuvre ici ), mais quoi que je fasse, je ne vois pas les journaux s'afficher dans ApplicationInsights avec cela.
Ci-dessous mon code:
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 ... )
}
Ensuite, j'essaie d'utiliser ceci dans mon contrôleur comme ceci:
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" );
}
Cependant, je ne vois aucune exception associée à la demande. Si je remplace la ligne Logger.LogError
par TelemetryClient.TrackException
(et crée d'abord la TelemetryClient
), je peux alors voir l'exception sans aucun problème.
Je ne sais pas ce que je fais mal. Quelqu'un pourrait-il aider?
J'ai finalement compris. Il y a deux façons de résoudre mon problème:
Moyen facile:
J'utilisais d'anciennes versions de NuGets Application Insights. Plus précisément, Microsoft.ApplicationInsights.2.2.0
et Microsoft.ApplicationInsights.AspNetCore.2.0.0
.
Une fois la mise à niveau vers Microsoft.ApplicationInsights.2.4.0
et Microsoft.ApplicationInsights.AspNetCore.2.1.1
, tout fonctionne comme prévu. Vous voyez également la LogXXX
avec une exception en tant qu'argument comme exception, et une exception sans exception comme trace, comme prévu.
Chemin légèrement plus difficile:
Pour une raison quelconque, IApplicationBuilder
et IServiceProvider
dans Configure
ne fournit pas le fournisseur de service correct à utiliser dans AddApplicationInsights
, vous devez donc l'ajouter dans les services ConfigureServices:
public void ConfigureServices( IServiceCollection services )
{
IServiceProvider serviceProvider = services.BuildServiceProvider();
this.LoggerFactory.AddApplicationInsights( serviceProvider, Extensions.Logging.LogLevel.Information );
...
}
Cela signifie que vous devez enregistrer la loggerFactory
du constructeur dans une propriété/un champ car elle n'est pas disponible via l'injection de dépendance dans ConfigureServices
.
Ce que j'ai fini par faire (probablement la meilleure solution pour le moment à mon avis):
Même si le problème n’est résolu que par l’une des solutions ci-dessus, j’ai décidé de faire les deux. C'est parce que je veux aussi pouvoir enregistrer l'erreur dans ConfigureServices
. Si je mettais loggerFactory.UseApplicationInsights
dans Configure
, je ne serais pas en mesure de voir l'erreur dans ConfigureServices
sur ApplicationInsights. Je préfère également voir les traces et les exceptions, une fonctionnalité fournie uniquement avec la nouvelle version du package.
Selon votre description, je vous suggère d'essayer les codes ci-dessous pour permettre à ILogger de consigner l'erreur dans ApplicationInsights.
Vous pouvez directement utiliser la méthode loggerFactory.AddApplicationInsights () pour activer ILogger ApplicationInsights.
Plus de détails, vous pouvez vous référer aux codes ci-dessous:
La classe de démarrage:
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?}");
});
}
}
Le appsettings.json:
{
"ApplicationInsights": {
"InstrumentationKey": "yourkey"
}
}
Résultat:
Mettre à jour:
L'enregistrement trouve dans la fonction de recherche.
Malheureusement, le SDK n'a été mis à jour que récemment pour déclencher Exception Telemetry (voir commit ), et la modification n'a pas encore été publiée.
Les seules routes que je vois actuellement sont soit de laisser l'appel explicite à TelemetryClient.TrackException
dans votre code, soit de l'envelopper avec votre propre implémentation de ILogger
, deux solutions temporaires jusqu'à ce que le SDK officiel le prenne en charge.