2017-10-04 16 views
1

Nous utilisons:Comment utiliser MDC de logback et SLF4J avec Spring Boot pour capturer un suivi unique dans la requête POST json?

  • Spring Boot
  • SLF4J
  • Logback
  • ELK pile

Maintenant, nous voulons utiliser MDC pour ajouter le numéro de suivi unique, qui est prévu dans le POST demande JSON, à chaque instruction de journal pour une demande donnée.

J'ai googlé quelques articles de blog, ceux-ci ne sont pas très utiles pour moi.

est inférieure à la logback.xml que nous utilisons

<configuration> 
    <property name="PROJECT_ID" value="template-api"/> 

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 
     <encoder class="net.logstash.logback.encoder.LogstashEncoder"/> 
    </appender> 

    <root level="INFO"> 
     <appender-ref ref="STDOUT" /> 
    </root> 
</configuration> 

Quelqu'un peut-il fournir une aide pour réaliser ce but s'il vous plaît?

Répondre

0

Vous pouvez utiliser le Mapped Diagnotic Context de Logback pour propager un numéro de suivi unique à chaque message de journal.

Il y a deux parties à ceci:

  • Poussez votre numéro de suivi unique en MDC par exemple MDC.put("uniqueTrackingNumber", the_unique_tracking_number);

  • Incluez l'entrée MDC dans vos instructions de consignation. Pour ce faire, spécifiez-le dans votre modèle de consignation. Donc, si vous enregistrez le numéro de suivi unique dans une entrée MDC nommé uniqueTrackingNumber alors vous inclure dans vos événements journaux émis par definiting une mise en page comme ceci:

<layout class="ch.qos.logback.classic.PatternLayout"> 
    <Pattern> 
     %d{yyyy-MM-dd HH:mm:ss} [%thread] [%X{uniqueTrackingNumber}] %-5level %logger{36} - %msg%n 
    </Pattern> 
</layout> 

Plus de détails in the docs.

Je présume que la portée d'un "numéro de suivi unique" est limitée à une requête (ou un seul 'flux' à travers votre application)? Si c'est le cas, alors vous voudrez identifier un point d'étranglement où vous pouvez pousser la valeur MDC sur le chemin. Dans le monde de démarrage de printemps, il est probable qu'il s'agisse d'un Filter. Quelque chose comme ça, peut-être:

@Component 
public static class UniqueTrackingNumberFilter extends OncePerRequestFilter() { 

    @Override 
    protected abstract void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) 
        throws ServletException, IOException { 
     // presumably this is extracted from the request (or defaulted, if not supplied) 
     int uniqueTrackingNumber = ; 
     MDC.put("uniqueTrackingNumber", uniqueTrackingNumber); 
    } 
} 

vous pourriez aussi étendre Logback de MDCInsertingServletFilter pour extraire tout ce que vous voulez de la demande et le pousser dans MDC.