63 votes

Quand utiliser le «contexte de diagnostic imbriqué» (NDC)?

Jouer avec log4net, j'ai vu la possibilité d'utiliser par la pile de contexte étiquettes appelé le NDC.

Les étiquettes poussé sur cette pile sont affichés dans une PatternLayout en spécifiant l' %x ou %ndc paramètre de format.

L'utilisation est quelque chose comme:

ILog log = log4net.LogManager.GetLogger(...) ;

//pattern layout format: "[%ndc] - %message%newline"

log.Info("message 1"); 
using(log4net.NDC.Push("context")
{
    using(log4net.NDC.Push("inner_context")
    {
      log.Info("message 2"); 
    }
    log.Info("message 3"); 
}
log.Info("message 4");

La sortie est quelque chose comme:

null - message 1
context inner_context - message 2
context - message 3
null - message 4

Dans votre expérience de la programmation avec log4net, quand avez-vous trouvé cette caractéristique d'être utile?

86voto

Donal Lafferty Points 1390

Vous voulez un exemple?

Prendre la suite de l'API Web écrite à l'aide de ASP.NET MVC4:

    // GET api/HypervResource
    public string Get()
    {
        logger.Debug("Start of service test");
        System.Threading.Thread.Sleep(5000); // simulate work
        logger.Debug("End of service test");
        return "HypervResource controller running, use POST to send JSON encoded RPCs"; ;
    }

Lorsque le serveur HTTP simultanés des Demandes, l'enregistrement peut obtenir entrelacés. E. g.

2013-06-27 13:28:11,967 [10] DEBUG HypervResource.WmiCalls [(null)] - Start of service test
2013-06-27 13:28:12,976 [12] DEBUG HypervResource.WmiCalls [(null)] - Start of service test
2013-06-27 13:28:14,116 [13] DEBUG HypervResource.WmiCalls [(null)] - Start of service test
2013-06-27 13:28:16,971 [10] DEBUG HypervResource.WmiCalls [(null)] - End of service test
2013-06-27 13:28:17,979 [12] DEBUG HypervResource.WmiCalls [(null)] - End of service test
2013-06-27 13:28:19,119 [13] DEBUG HypervResource.WmiCalls [(null)] - End of service test

Dans cet exemple simple, vous pouvez utiliser l'id de thread pour distinguer les demandes, mais qui peut être délicat que le fichier journal se développe dans la complexité.

Une meilleure alternative est de fournir des identifiants uniques qui regroupent les messages de journal pour la même demande. Nous pouvons mettre à jour le code sur les points suivants:

        // GET api/HypervResource
    public string Get()
    {
        using(log4net.NDC.Push(Guid.NewGuid().ToString()))
        {
            logger.Debug("Start of service test");
            System.Threading.Thread.Sleep(5000); // simulate work
            logger.Debug("End of service test");
            return "HypervResource controller running, use POST to send JSON encoded RPCs"; ;
        }
    }

Cela produit un journal que vous pouvez grep de voir les problèmes associés à une demande spécifique. E. g.

2013-06-27 14:04:31,431 [11] DEBUG HypervResource.WmiCalls [525943cb-226a-43c2-8bd5-03c258d58a79] - Start of service test
2013-06-27 14:04:32,322 [12] DEBUG HypervResource.WmiCalls [5a8941ee-6e26-4c1d-a1dc-b4d9b776630d] - Start of service test
2013-06-27 14:04:34,450 [13] DEBUG HypervResource.WmiCalls [ff2246f1-04bc-4451-9e40-6aa1efb94073] - Start of service test
2013-06-27 14:04:36,434 [11] DEBUG HypervResource.WmiCalls [525943cb-226a-43c2-8bd5-03c258d58a79] - End of service test
2013-06-27 14:04:37,325 [12] DEBUG HypervResource.WmiCalls [5a8941ee-6e26-4c1d-a1dc-b4d9b776630d] - End of service test
2013-06-27 14:04:39,453 [13] DEBUG HypervResource.WmiCalls [ff2246f1-04bc-4451-9e40-6aa1efb94073] - End of service test

25voto

Joe Points 60749

Dans une application serveur telle que ASP.NET.

Par exemple, vous pouvez transmettre des informations sur la demande en cours au NDC.

20voto

Eugene Yokota Points 43213

Ces fonctionnalités sont utiles lorsque vous avez beaucoup de journaux à parcourir. Quand auriez-vous beaucoup de journaux? Diagnostiquer un bogue étrange sur un système de production avec des sorties entrelacées. Avoir plus de contextes vous permet de filtrer la sortie ou de ne pas générer de journaux inutiles.

Un autre cas, les contextes imbriqués peuvent être utiles si une méthode ou une fonctionnalité est appelée plusieurs fois dans différents contextes et si vous avez besoin d'un moyen de les distinguer.

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