2017-08-31 67 views
3

在Logback中,可以使用setLevel()方法更改记录器的日志级别。 但是在Logback中,因为记录器是singleton,所以setLevel()方法的调用将影响所有其他使用相同记录器的线程。如何使用Logback更改当前线程的日志级别

现在我在web应用中使用这样的类:

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 
    } 
} 

,春天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> 

我想记录从insertOne方法insertRecord的调用。另一方面,在insertMany方法中,我希望在循环之前停止日志记录(因为它可能会输出大量日志),并在循环之后继续日志记录。 但是,如果在循环之前调用setLevel(),则日志级别的更改将影响其他线程中使用的其他记录器。在这种情况下,我认为你会在其他线程上得到明确的日志。

我的问题是:如何更改当前线程中使用的记录器的日志级别?

+0

您可以定义一个特定的appender你的包或者你 –

+0

类五言,你可以定义更多的appender类FooService接口,但是如果有两个或更多线程同时执行FooService,则所有线程都会受到setLevel()的影响。这对我来说是不理想的结果。 – satob

回答

2

我找到了解决方案。您可以为此使用MDC和TurboFilter。 MDC是线程本地的,更改为MDC不会影响其他线程。

例如,如果要停止所有日志活动,你必须MDCFilter的定义添加到logback.xml(请注意,<turboFilter>标签不能是<appender>标签的孩子,应该是<configuration>标签的孩子) :

<configuration> 
    <turboFilter class="ch.qos.logback.classic.turbo.MDCFilter"> 
     <MDCKey>tracing</MDCKey> 
     <Value>off</Value> 
     <OnMatch>DENY</OnMatch> 
    </turboFilter> 
    ...... 
</configuration> 

,您可以通过PUT /关闭记录/删除键,这样的值MDC(请注意,你应该考虑有关的异常在实际使用中):

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 
     MDC.put("tracing", "off"); 
     for (Foo foo: foos) { 
      insertRecord(foo); 
     } 
     // I want to resume logging here 
     MDC.remove("tracing"); 
    } 
} 

或者,如果你想停止跟踪/调试/ INFO/WARN日志,但留下错误日志活跃,您可以使用DynamicThresholdFilter:

<configuration> 
    <turboFilter class="ch.qos.logback.classic.turbo.DynamicThresholdFilter"> 
     <Key>tracing</Key> 
     <DefaultThreshold>TRACE</DefaultThreshold> 
     <MDCValueLevelPair> 
     <value>off</value> 
     <level>ERROR</level> 
     </MDCValueLevelPair> 
    </turboFilter> 
    ...... 
</configuration> 
+0

DynamicThresholdFilter正是我所需要的,谢谢! – xtian

相关问题