3 votes

NLog avec Application Insights - enregistrer les exceptions comme une exception au lieu d'une trace

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 :

enter image description here

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 :

http://localhost/hello/name

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.

3voto

Rolf Kristensen Points 1326

NOTA ServiceStack 5.8 a été publié et corrige le problème.

J'ai regardé Service Stack ver. 5.7 Logger Interface. Et cela ne fonctionne pas :

// Will pass exception a string.Format parameter
Log.Fatal("test no message - fatal", new NotImplementedException());
// Will make Service Stack call Exception.ToString
Log.Error(new NotImplementedException("test no message - error"));

Et vous devez faire cette solution de contournement pour atteindre correctement le NLog :

Log.Fatal(new NotImplementedException(), "test no message - fatal");
Log.Error(new NotImplementedException("test no message - error"), ex.Message);

J'ai créé le PR suivant https://github.com/ServiceStack/ServiceStack/pull/1210 afin que Service Stack transmette correctement l'objet d'exception au NLog, lors d'un appel avec l'objet d'exception seul.

2voto

Ivan Yang Points 13080

Je peux l'enregistrer comme Exception au lieu de Trace via Log.Fatal(new NotImplementedException("test not implemented exception"));

Le paquet nuget que j'ai installé pour le projet web .net core :

Microsoft.ApplicationInsights.NLogTarget, version 2.11.0

Microsoft.ApplicationInsights.AspNetCore, version 2.8.2

Voici le NLog.config dans mon projet :

<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <extensions>
    <add assembly="Microsoft.ApplicationInsights.NLogTarget" />
  </extensions>
  <targets>
    <target xsi:type="ApplicationInsightsTarget" name="aiTarget">
      <!--<instrumentationKey>Your_Resource_Key</instrumentationKey>-->
      <!-- Only required if not using ApplicationInsights.config -->
      <contextproperty name="threadid" layout="${threadid}" />
      <!-- Can be repeated with more context -->
    </target>
  </targets>
  <rules>
    <logger name="*" minlevel="Trace" writeTo="aiTarget" />
  </rules>
</nlog>

Et dans HomeController.cs -> méthode Index() :

        public IActionResult Index()
        {
            Logger logger = LogManager.GetLogger("HomeController");
            logger.Fatal(new NotImplementedException("test not implemented exception, only one new exception() 222"));
            return View();
        }

Après l'exécution du code, dans le portail azur -> Application Insights -> Search, ce message enregistré est affiché sous Exception. Capture d'écran comme ci-dessous :

enter image description here

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X