Logback文档说,自动扫描与日志操作一起工作,即
检查扫描周期是否已经过去,成本过高 本身。为了提高性能,ReconfigureOnChangeFilter是 实际上“活着”只有N次登录操作一次。取决于 您的应用程序记录的频率,N的值可以修改 通过logback飞行。默认情况下,N为16,尽管它可以高达2 ^ 16 (= 65536)用于CPU密集型应用程序。
有没有办法通过任何其他方式在xml OR中配置'N'的值。
答案 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
配置。