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

Java 在Logback自动扫描中配置日志记录操作,java,slf4j,logback,Java,Slf4j,Logback,Logback文档说,自动扫描与日志操作协同工作,即 检查扫描周期是否已过,在这种情况下成本太高 它本身为了提高性能,需要重新配置ChangeFilter 实际上,每N次日志记录操作只“活动”一次。取决于 应用程序记录日志的频率,可以在 靠后备箱飞行。默认情况下,N为16,但可以高达2^16 (=65536)用于CPU密集型应用程序 是否有任何方法可以在xml中或通过任何其他方式配置“N”的值。快速查看ch.qos.logback.classic.turbo.ReconfigureOnChang

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

检查扫描周期是否已过,在这种情况下成本太高 它本身为了提高性能,需要重新配置ChangeFilter 实际上,每N次日志记录操作只“活动”一次。取决于 应用程序记录日志的频率,可以在 靠后备箱飞行。默认情况下,N为16,但可以高达2^16 (=65536)用于CPU密集型应用程序


是否有任何方法可以在xml中或通过任何其他方式配置“N”的值。

快速查看
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;
}
但是,如文档所示,此
掩码
(或
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;
    }
  }
//实验表明,即使对于具有200个或更多线程的CPU密集型应用程序
//0xFFFF顺序的值是合适的
私有静态最终整数最大掩码=0xFFFF;
//如果调用UpdateMaskifNeccessary()方法之间的时间间隔小于MASK_INCREASE_阈值毫秒,
//然后增加遮罩
私有静态最终长掩码\u增加\u阈值=100;
//如果调用updateMaskIfNecessary()方法之间的时间间隔超过掩码减少阈值毫秒,
//然后应该减少遮罩
私有静态最终长掩码\u减少\u阈值=掩码\u增加\u阈值*8;
//更新掩码,以便大约每100到8000毫秒执行一次更改检测代码。
私有void updateMaskIfNecessary(现在很长){
最终长时间ElapsedSincellastMaskupdateCheck=now-lastMaskCheck;
lastMaskCheck=now;
if(timeElapsedSinceLastMaskUpdateCheck>>2;
}
}
最后一个条件是,如果上次检查是在800 ms之前执行的,则
N
的值太高,需要向下调整


假设您没有非常频繁的日志,那么您可以预期,
mask
的值最终会降到
0
,更改检测将不再被跳过,并且它会像您预期的那样开始遵守您的
扫描周期
配置。

也许回写邮件列表是一个更好的选择r问这个问题的地方谢谢你提供详细的信息这节省了我很多时间。