Bonsoir,

voici mon pb :

Nous avons une appli Web (qui est en réalité plus un plugin d'une autre appli web sur laquelle nous n'avons aucun contrôle).
A chaque nouvelle session, un objet personnalisé "User" est défini avec des infos transmises par l'appli qui execute notre plugin.

Je voudrais écrire un log par USER.

Cela semble parfaitement faisable, en créant des SiftAppender définissant un FileAppender dont le nom sera défini par une variable issue du MDC

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
<appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender">
     <discriminator>
         <key>userid</key>
         <defaultValue>unkonwn</defaultValue>
    </discriminator>
    <sift>
        <appender name="MON_APPLI_${userid}" class="...">
            <file>${userid}.log</file>
            <append>true</append>
            <encoder>
                  <pattern>%d %level %msg%n</pattern>
            </encoder>
        </appender>
    </sift>
</appender>
Cela fonctionne parfaitement si je définis mon MDC (via MDC.put("userid", user.id)) et que je trace derrière mon info.

Par contre, si je tente d'automatiser l'ajout au MDC via un filter, j'ai un pb.

En effet, il est dit dans la doc qu'il y a un MDC / thread, or ici l'appli est déployée sur un serveur tomcat et utilisée de facon monothread. Du coup, mon MDC est commun et je ne peux setter la valeur utilisée pour l'appender lorsque plusieurs sessions sont connectées en même temps.


Existe t il un moyen de faire cela en définissant à un instant T (après la récup du USER) une property via un define dans le fichier xml + une classe redéfinissant la getPropertyDefine ?

Ou bien serait il plus judicieux de faire une class perso, dans laquelle je set ma valeur du MDC, je trace, et je dégage la valeur du MDC ensuite..... ?

Si qqun a une idée je suis preneur.

Merci.

ps: je suis assez débutant, donc dsl si mon post n'est pas super clair. Toute idée est bonne à prendre.