2016-04-07 33 views
5

Abbiamo un enorme codice legacy con flusso complesso con operazioni di sincronizzazione e asincrone. Pertanto, è necessario registrare un ID univoco per una richiesta specifica in tutti i messaggi di registro, dove le operazioni eseguite sono eseguite in thread diversi e che i thread si trovano in più contesti di esecuzione.Come registrare l'ID di richiesta nel log del framework di riproduzione su tutto il contesto di esecuzione

Ho provato a utilizzare MDC e specificare -% X {req_id} in logger.xml e la soluzione fornita nel blog sotto menzionato utilizzando il dispatcher di akka personalizzato, ma non funziona in più contesti di esecuzione, e inoltre non funziona affidabile in contesto di esecuzione singola, dove a volte restituisce req_id null. (http://yanns.github.io/blog/2014/05/04/slf4j-mapped-diagnostic-context-mdc-with-play-framework/)

A causa della base di codice complessa ed enorme non è possibile passare l'ID di richiesta in ogni chiamata di funzione. C'è un modo per raggiungere questo obiettivo, con meno modifiche? Abbiamo bisogno dell'ID di richiesta nei log generati anche dal framework di gioco.

risposta

0

Ho avuto la stessa necessità di registrare qualche token di traccia per scopi di debug. La libreria Kamon ha già questa funzione http://kamon.io/integrations/logback/trace-token-converter/.

Nel mio Global.java: faccio Kamon.start() in onStart() e mantengo il contesto in onRequest(). Utilizzare anche lo traceToken nel modello di registrazione.

public Action onRequest(Http.Request request, Method actionMethod) { 
    TraceContext tx = Kamon.tracer().newContext("reqc", new Some<>(Utils.randStr(8))); 
    Tracer.setCurrentContext(tx); 
    Logger.info("Request: " + request.toString()); 
    Action x = super.onRequest(request, actionMethod); 
    tx.finish(); 
    return x; 
} 
+0

ma onRequest() non è disponibile in tutto il contesto di esecuzione in Play. Secondo la mia comprensione, ho ragione? – user3828976

+0

'onRequest()' è disponibile solo quando viene effettuata una richiesta. Allo stesso modo in tutti gli altri contesti devi creare e finire 'TraceContext'. – hrushikesh

+0

L'abbiamo risolto passando al contesto di esecuzione singola. – user3828976

0

Abbiamo risolto questo spostandoci in contesto single executor e riproduciamo 2.5 raccomanda anche di farlo. In questo scenario, il contesto mdc funzionerà.

+0

Quindi l'hai risolto, ma come? come questo solo un commento non una soluzione! –

+0

in application.conf è necessario aver definito un contesto di esecuzione differente. Basta non usarne uno, non ho copia del file conf ora. – user3828976