【发布时间】:2017-08-31 16:18:50
【问题描述】:
在 Logback 中,可以使用 setLevel() 方法更改 logger 的日志级别。 但是在 Logback 中,由于 logger 是单例的,所以 setLevel() 方法的调用会影响到所有其他使用相同 logger 的线程。
现在我有一个在这样的网络应用程序中使用的类:
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
}
}
在 Spring 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] with return value $[returnValue], took $[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>
我想记录 insertOne 方法对 insertRecord 的调用。另一方面,在 insertMany 方法中,我想在循环之前停止记录(因为它可能会输出大量日志),并在循环之后恢复记录。 但是如果你在循环之前调用 setLevel() ,日志级别的变化会影响到其他线程中使用的其他记录器。在这种情况下,我认为您会在其他线程上获得不足的日志。
我的问题是:如何仅为当前线程中使用的记录器更改日志级别?
【问题讨论】:
-
你可以为你的包或者你的类定义一个特定的 appender
-
当然你可以为类FooService定义额外的appender,但是如果有两个或更多线程同时执行FooService,所有线程都会受到setLevel()的影响。这对我来说是不受欢迎的结果。
-
您可以为它们设置两个不同的记录器。