fulviot66 ha scritto:
ho provato ad implementare MDC, che nella mia versione 2.4 di Log4j2 si chiama ThreadContextStack, ma senza successo.
Sì, nel "vecchio" log4j (intendo la 1.x) c'erano i due concetti MDC e NDC (N sta per Nested) che erano distinti e gestiti separatamente. In log4j 2.x questi due concetti ci sono
ancora ma sono stati tecnicamente "fusi" insieme in quel ThreadContext.
La cosa comunque è abbastanza semplice:
a) Nel pattern del log devi mettere nel punto che vuoi lo specificatore per espandere il valore di una chiave gestita con il MDC, ad esempio:
<PatternLayout pattern="%d %-5p [%t] IP=%X{remIP} %C{2} (%F:%L) - %m%n"/>
Nota che il valore della chiave è assolutamente a scelta. Ho messo remIP ma puoi mettere IP, remoteIP, remInd, ecc... come ti pare.
b) Poi la questione è dove mettere il put del valore. MA dipende dalla API che usi a livello web. Cosa hai usato? Spring? JavaEE? Altro?
Dal momento che il set di quel valore deve fare da "contesto" per tutta la gestione di una request in un certo thread, allora dovrebbe essere settato possibilmente in un punto più "alto" possibile della richiesta.
Con Spring l'ideale sarebbe farlo in un
interceptor che intercetta tutte le chiamate. Per il momento, per provare, se usi Spring puoi farlo all'inizio di un metodo di un controller.
ThreadContext.put("remIP", request.getRemoteAddr());
Dove request è il classico HttpServletRequest di Java (lo puoi avere come parametro in un controller Spring)
Se usi Spring e
non sai come fare un interceptor, ti faccio un esempio.
EDIT: ho visto il codice che hai aggiunto. Con push/pop stai usando il NDC. A te basta usare il MDC, quindi put. E nota che %X è per il MDC ... non NDC.
EDIT2: ho notato che hai usato un filter mettendo @WebFilter(urlPatterns = "/*") ma poi l'hai dichiarato anche nel web.xml
Non è corretto. O usi @WebFilter O dichiari nel web.xml. Non vanno usati entrambi.