2017-10-09 7 views
2

J'ai cette application Web qui enregistre assez fortement. Nous avons implémenté un appel à MDC pour chaque thread demandeur afin de pouvoir tracer un utilisateur dans nos journaux.Enregistrement des valeurs de clé facultatives

Un logmessage pourrait se présenter comme suit:

INFO [2017-10-09 10:10:55,841] user_uuid=123-123-123 com.myapp.SomeClass: Some log message... 

Maintenant, le problème est que la plupart du temps, aucun utilisateur actuel existe, et nous ne pas utiliser pour le champ user_uuid dans l'exemple du journal ci-dessus. Ainsi, au lieu, il ressemblera à ceci:

INFO [2017-10-09 10:10:55,841] user_uuid= com.myapp.SomeClass: Some log message... 

Est-il possible de ne pas écrire la clé MDC valeur & dans le journal s'il n'y a pas de valeur MDC? Un format de journal que je n'ai pas encore trouvé?

Je veux qu'il ressemble à cela, si aucune valeur MDC se trouve:

INFO [2017-10-09 10:10:55,841] com.myapp.SomeClass: Some log message... 

Les exemples ci-dessus (MDC) sont configurés comme ceci:

%-5p [%d{ISO8601,UTC}] user_uuid=%mdc{user_uuid:-} %c: %m%n%rEx 
+0

Vous pouvez simplement afficher le MDC complet (cela nécessite bien sûr de n'y stocker que des informations importantes), puis enregistrer uniquement les contenus existants. Dans votre exemple, vous avez codé en dur la partie 'user_uuid =', donc cela ne va nulle part. – Kayaman

+0

Voir https://stackoverflow.com/questions/24616745/how-to-conditionally-add-text-from-mdc-on-a-log4j-pattern pour un doublon. – Kayaman

Répondre

1

Cette entrée dans votre modèle ...

user_uuid=%mdc{user_uuid:-} 

... se compose de deux parties:

  1. Une 'racine' statique (c.-à-d. le côté gauche de l'assignation) ceci est toujours présent dans la sortie. La décision d'inclure ceci est prise lorsque Logback s'initialise.

  2. Valeur (c'est-à-dire le côté droit de l'affectation), elle est présente uniquement dans la sortie si l'attribut MDC user_uuid est rempli. La décision d'inclure ceci est prise lors de l'exécution pour chaque événement de journal.

probablement ne vous dit pas quelque chose de nouveau là, mais le point clé est que l'inclusion du côté gauche ne peut pas être annulée par une logique conditionnelle qui entre en jeu lors de l'évaluation de chaque événement de journal émis par votre application. Le PatternLayoutBase de Logback parcourt son modèle donné et chaque fois qu'il est question de quelque chose de conditionnel ou de dérivable, il l'évalue et ajoute la valeur évaluée au motif qu'il traverse. Donc, pour votre modèle; Logback a déjà affecté "user_uuid =" au StringBuilder actuel avant même d'avoir commencé à évaluer la condition MDC.

Cependant, vous pouvez atteindre l'objectif final souhaité par l'peuplant user_uuid attribut MDC avec: user_uuid=<the user id> puis modifiez vous connecter modèle pour vous connecter simplement la valeur MDC sans affectation. Par exemple:

%-5p [%d{ISO8601,UTC}] %mdc{user_uuid:-}%c: %m%n%rEx 

Avec ce modèle en place les invocations des journaux suivants ...

logger.info("Does this include the user_uuid?"); 
MDC.put("user_uuid", "user_uuid=me "); 
logger.info("Or does this include the user_uuid?"); 

...émettra:

INFO [2017-10-09 11:15:22,420] com.stackoverflow.SomeClassTest: Does this include the user_uuid? 
INFO [2017-10-09 11:15:22,435] user_uuid=me com.stackoverflow.SomeClassTest: Or does this include the user_uuid? 

bien que ce soit un peu bizarre parce que vous devez vous rappeler d'inclure un espace à la fin de la valeur MDC et cette user_uuid valeur MDC est seulement utile pour se connecter dans ce modèle spécifique (alors tout simplement, y compris la user_uuid - sans le côté gauche et l'opérateur égal - serait plus généralement utile).

Si ces inconvénients rendent cette approche unuseable pour vous, alors je pense que vous aurez à se coincer dans PatternLayoutBase ou FormattingConverter de Logback pour mettre en œuvre une certaine forme d'anticipation ou d'une certaine façon de modifier le StringBuilder en cours si la main droite côté d'une affectation renvoie une chaîne vide.

+0

Réponse très complète! Merci beaucoup :) Je vais créer une sorte de classe util pour gérer les appels MDC 'put'. (Qui les emballera avec 'key = ' –