Dans Logback, le niveau de journalisation d'un enregistreur peut être modifié avec la méthode setLevel(). Mais dans Logback, parce que les loggers sont singleton, l'appel de la méthode setLevel() affectera tous les autres threads qui utilisent le même logger.Comment modifier le niveau de journalisation uniquement pour le thread en cours avec Logback
Maintenant, j'ai une classe utilisée dans une application web comme celui-ci:
class FooService {
private void insertRecord(Foo foo) {
// insert one record to DB
}
public void insertOne(Foo foo) {
insertRecord(foo);
}
public void insertMany(List<Foo> foos) {
// I want to stop logging here
for (Foo foo: foos) {
insertRecord(foo);
}
// I want to resume logging here
}
}
Et au printemps ApplicationConfig.xml:
<bean id="traceAdvice"
class="org.springframework.aop.interceptor.CustomizableTraceInterceptor">
<property name="enterMessage"
value="Entering $[targetClassShortName].$[methodName]($[argumentTypes])[$[arguments]]" />
<property name="exitMessage"
value="Exiting $[targetClassShortName].$[methodName] : return = $[returnValue] : time = $[invocationTime]ms" />
<property name="exceptionMessage"
value="Exception thrown in $[targetClassShortName].$[methodName] : $[exception]" />
</bean>
<aop:config>
<aop:pointcut id="pointcut-service"
expression="execution(* my.app.service..*Service.*(..))" />
<aop:advisor advice-ref="traceAdvice" pointcut-ref="pointcut-service" />
</aop:config>
Je veux connecter appel InsertRecord de méthode insertOne. D'un autre côté, dans la méthode insertMany, je veux arrêter la journalisation juste avant la boucle (car cela pourrait générer énormément de logs), et reprendre la journalisation juste après la boucle. Mais si vous appelez setLevel() juste avant la boucle, la modification du niveau de journalisation affectera l'autre enregistreur utilisé dans d'autres threads. Dans cette situation, je pense que vous obtiendrez des logs décisifs sur les autres threads.
Ma question est: Comment changer le niveau de journal seulement pour l'enregistreur utilisé dans le fil en cours?
Vous pouvez définir un appender spécifique pour votre forfait ou votre classe –
Evidement, vous pouvez définir appender supplémentaire pour FooService de classe, mais s'il y a deux threads ou plus qui exécutent FooService simultanément, tous les threads sont affectés par setLevel(). C'est un résultat indésirable pour moi. – satob