J'utilise actuellement une application Web .NET Core construite à l'aide de Service Stack. La journalisation est actuellement assurée par NLog, avec Azure Application Insights comme cible.
Actuellement, lorsque je consigne les messages et les exceptions, je rencontre des comportements étranges :
Log.Fatal("test not implemented exception", new NotImplementedException()); //this logs under Exceptions in Application Insights
Log.Fatal(new NotImplementedException("test not implemented exception")); //this logs under Trace
Ce que j'aimerais, c'est pouvoir enregistrer la deuxième ligne comme une exception au lieu d'une trace. Existe-t-il un moyen d'y parvenir ?
Je n'ai pas trouvé de réponse à cette question, c'est pourquoi je la pose sous forme de question.
Les exceptions NLog comme trace dans Application Insights - celui-ci ne mentionne pas comment changer le type de trace en exception.
Application Insights - Enregistrement des exceptions - celui-ci ne mentionne pas le NLog
https://github.com/Microsoft/ApplicationInsights-dotnet-logging/issues/102 - C'est ce qui se rapproche le plus de ce dont j'ai besoin, mais il n'y a pas eu de mise à jour.
EDIT : Comme les commentaires ne permettent pas d'afficher correctement les images et le formatage, j'ai testé avec les lignes de code suivantes :
Log.Fatal("test no message - fatal", new NotImplementedException());
Log.Error(new NotImplementedException("test no message - error"));
Le résultat est le suivant :
EDIT 2 : Les versions des paquets sont les suivantes :
NLog (4.6.8)
NLog.Web.AspNetCore (4.9.0)
Microsoft.ApplicationInsights.AspNetCore (2.8.2)
Microsoft.ApplicationInsights.NLogTarget (2.11.0)
EDIT 3 : Un peu plus de code :
Notre couche d'interface de service utilise ce code. Elle implémente des éléments de la classe Service, qui est fournie par Service Stack. En définissant le LogFactory comme ci-dessus, nous sommes capables de le faire passer à nos couches de service.
Cette interface de service est hébergée dans un projet distinct qui se trouve sous la même solution (appelons-le Api.ServiceInterface).
AppServiceBase.cs
public abstract class AppServiceBase : Service
{
protected ILog Log { get; set; }
protected ICacheClient CacheClient { get; set; }
protected AppServiceBase()
{
Log = LogManager.GetLogger(GetType());
}
public AppServiceBase(ICacheClient cacheClient) : this()
{
CacheClient = cacheClient;
}
public UserSession UserSession => this.GetSession() as UserSession;
}
HelloService.cs (un service qui s'étend à partir de AppServiceBase, et qui peut donc appeler directement le logger dans AppServiceBase ci-dessus).
public class HelloService : AppServiceBase
{
public object Any(Hello request)
{
Log.Fatal("test no message - fatal 1", new NotImplementedException());
Log.Error(new NotImplementedException("test no message - error 1"));
return new HelloResponse { Result = $"Hola, {request.Name}!" };
}
}
Nous appelons cette fonction en utilisant l'URL suivante :
Tout ce qu'il fait est de retourner un texte qui dit "Hola, nom !"
Malheureusement, je ne peux pas joindre un débogueur - pour une raison quelconque, je n'arrive pas à trouver un point d'arrêt.
Je ne sais pas si je dois avoir les mêmes bibliothèques dans le projet Api.ServiceInterface également. Notez que Api.ServiceInterface est un projet de type Class Library et fonctionne sous .NET Standard 2.0.