Quelle est la différence entre les facilités NDC et MDC de Log4j

Pour développer le lien que Sikorski a posté dans les commentaires:

NDC

Dans NDC, le N signifie nested , ce qui signifie que vous contrôlez une seule valeur avec un Stack. Vous « poussez » une chaîne, puis vous pouvez en « pousser » une autre lorsque le traitement vous le demande ; et lorsque le traitement est terminé, vous pouvez l’ouvrir pour voir la valeur précédente. Ce type d’enregistrement contextuel serait utile dans certains processus profondément imbriqués.

Définir la chaîne de contexte

NDC.Push("processingLevel2"); log.info("success");

Cela donnera des résultats dans votre registre où vous avez le motif %x (minuscules) :

log4j.appender.CA.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss.SSSS} %p %C %x = %m%n

MDC

Le M signifie alloué , et cela vous donne un autre type de contrôle. Au lieu d’utiliser une seule pile pour contrôler une seule chaîne contextuelle, il utilise des paires nom/valeur. Cela est utile pour suivre plusieurs bits contextuels, comme le fait de mettre le nom d’utilisateur et l’IP dans le registre.

Définir les valeurs mappées :

MDC.put("userIP", req.getRemoteAddr());MDC.put("userName", foo.getName());log.info("success");

Exemple de motif MD4 log4j

Uppercase X avec les chaînes d’exemple "userIP" AND "userName". Ceux-ci devraient correspondre dans votre code et dans la configuration de log4j :

log4j.appender.CA.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss.SSSS} %p %X{userIP} %C %X{userName} = %m%n

Je les combinerais en une seule) chaîne de contexte *.

Similitudes et différences

Dans les deux cas, chaque fois que vous effectuez le log.info("success");, la sortie aura le contexte supplémentaire que vous avez fourni. C’est beaucoup plus propre que de concaténer des chaînes comme log.info(req.getRemoteAddr()) + " success"); à chaque fois que vous vous connectez.

Veuillez noter qu’il existe de sérieuses différences entre les deux en ce qui concerne les threads et les ressources. En particulier, NDC conservera des identifiants pour vos threads, ce qui peut affecter la libération des ressources si vous n’êtes pas diligent pour popper et effacer la pile NDC.

D’après le lien : l’utilisation de NDC peut provoquer des fuites de mémoire si vous n’appelez pas périodiquement la méthode NDC.remove().

.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *