在Logback自动扫描中配置日志记录操作

时间:2015-06-24 12:02:22

标签: java slf4j logback

Logback文档说,自动扫描与日志操作一起工作,即

  

检查扫描周期是否已经过去,成本过高   本身。为了提高性能,ReconfigureOnChangeFilter是   实际上“活着”只有N次登录操作一次。取决于   您的应用程序记录的频率,N的值可以修改   通过logback飞行。默认情况下,N为16,尽管它可以高达2 ^ 16   (= 65536)用于CPU密集型应用程序。

有没有办法通过任何其他方式在xml OR中配置'N'的值。

1 个答案:

答案 0 :(得分:1)

快速查看ch.qos.logback.classic.turbo.ReconfigureOnChangeFilter类中的源代码(logback 1.1.3),可以看到以下内容:

N的起始值是硬编码的,如下所示:

  private volatile long mask = 0xF;

如果没有更改源代码并自行重新编译对此常量的更改,代码不会提供任何类型的配置选项来更改此内容。

如何使用mask变量可以在这段代码中看到:

// for performance reasons, skip change detection (MASK-1) times out of MASK.
// Only once every MASK calls is change detection code executed
// Note that MASK is a variable itself.
if (((invocationCounter++) & mask) != mask) {
  return FilterReply.NEUTRAL;
}

但是,正如文档所示,这个mask(或N)值会通过logback动态调整,因为它感觉需要以保持良好的性能。

该文档仅讨论N在感觉需要时向上调整的价值。但代码显示,当感觉N的值太高时,它还会动态调整值 向下

请注意以下代码,该代码确定如何动态调整N

的值
  // experiments indicate that even for CPU intensive applications with 200 or more threads MASK
  // values in the order of 0xFFFF is appropriate
  private static final int MAX_MASK = 0xFFFF;


  // if less  than MASK_INCREASE_THRESHOLD milliseconds elapse between invocations of updateMaskIfNecessary() method,
  // then the mask should be increased
  private static final long MASK_INCREASE_THRESHOLD = 100;

  // if more than MASK_DECREASE_THRESHOLD milliseconds elapse between invocations of updateMaskIfNecessary() method,
  // then the mask should be decreased
  private static final long MASK_DECREASE_THRESHOLD = MASK_INCREASE_THRESHOLD*8;

  // update the mask so as to execute change detection code about once every 100 to 8000 milliseconds.
  private void updateMaskIfNecessary(long now) {
    final long timeElapsedSinceLastMaskUpdateCheck = now - lastMaskCheck;
    lastMaskCheck = now;
    if (timeElapsedSinceLastMaskUpdateCheck < MASK_INCREASE_THRESHOLD && (mask < MAX_MASK)) {
        mask = (mask << 1) | 1;
    } else if (timeElapsedSinceLastMaskUpdateCheck > MASK_DECREASE_THRESHOLD) {
      mask = mask >>> 2;
    }
  }

最后一个条件是,如果上次检查的执行时间超过800毫秒,那么N的值太高,需要调低。

假设您没有非常频繁的日志,那么您可以预期最终mask的值将降至0,更改检测将不再被跳过,并且实际上按照您的预期开始尊重您的scan period配置。

相关问题