Logback - 在运行时以编程方式修改DynamicThresholdFilter(TurboFilter)

时间:2013-11-24 17:37:03

标签: logback

我们正在使用具有DynamicThreshholdFilter定义的logback,如下所示

<turboFilter class="ch.qos.logback.classic.turbo.DynamicThresholdFilter">
   <Key>USER_MDC_KEY</Key>
   <DefaultThreshold>DEBUG</DefaultThreshold>
   <MDCValueLevelPair>
      <value>USER1</value>
      <level>DEBUG</level>
   </MDCValueLevelPair>
</turboFilter>

有没有办法以编程方式修改MDCValueLevelPair的设置。例如,将USER1的级别修改为INFO。

2 个答案:

答案 0 :(得分:2)

无法动态修改,因为有一项阻止它的检查。

但是,您可以使用以下内容动态设置它:

Iterator<TurboFilter> it = ((ch.qos.logback.classic.LoggerContext)LoggerFactory.getILoggerFactory()).getTurboFilterList().iterator();
while (it.hasNext()) {
  TurboFilter f = it.next();
  if (f instanceof DynamicThresholdFilter) {
    DynamicThresholdFilter dtFilter = (DynamicThresholdFilter)f;
    MDCValueLevelPair pair = new MDCValueLevelPair();
    pair.setValue("USER1");
    pair.setLevel(Level.INFO);
    dtFilter.addMDCValueLevelPair(pair);
  }
}

如果您尚未配置TurboFilter,则可以创建一个新的并将其添加到LoggerContext

答案 1 :(得分:1)

我认为您可以添加另一个MDC键/值对来控制日志级别,而不是更改USER1的日志级别。

<configuration>
  <turboFilter class="ch.qos.logback.classic.turbo.DynamicThresholdFilter">
    <Key>LEVEL_FOR_USER1</Key>
    <DefaultThreshold>DEBUG</DefaultThreshold>
    <MDCValueLevelPair>
      <value>INFO</value>
      <level>INFO</level>
    </MDCValueLevelPair>
  </turboFilter>
  ......
</configuration>
MDC.put("LEVEL_FOR_USER1", "INFO");