Log4J 2配置监控和按位比较

时间:2015-06-03 12:18:45

标签: java logging log4j2 java.util.concurrent

一位同事指出Log4J 2.3 code的以下片段:

/**
  * Called to determine if the configuration has changed.
  */
 @Override
 public void checkConfiguration() {
     final long current = System.currentTimeMillis();
     if (((counter.incrementAndGet() & MASK) == 0) && (current >= nextCheck)) {
         LOCK.lock();
         try {
             nextCheck = current + intervalSeconds;
             if (file.lastModified() > lastModified) {
                 lastModified = file.lastModified();
                 for (final ConfigurationListener listener : listeners) {
                     final Thread thread = new Thread(new ReconfigurationWorker(listener, reconfigurable));
                     thread.setDaemon(true);
                     thread.start();
                 }
             }
         } finally {
             LOCK.unlock();
         }
     }

其中counterAtomicInteger字段,MASK设置为0x0fnextChecklong

据我所知,此方法会检查是否重新加载配置,但仅当counter的值可被16 整除时才会这样做下一个配置检查周期已过。

为什么这是按位和那里?

鉴于incrementAndGet实例的counter已同步,可将其视为"廉价"节流机制?或者也许在{"典型"期间调用checkConfiguration的次数。 nextCheck句点不仅仅是必要的,因此按位AND就是一个表演技巧(再次,限制?)。

1 个答案:

答案 0 :(得分:0)

是的,这是一种限制机制。在Log4j 2.3中,为每个日志事件调用此方法。按位AND表示检查的其余部分仅每16个日志事件执行一次。

正如评论中所指出的那样,在性能提升方面这是多么有效。拨打System::currentTimeMillis的电话不是免费的,并且在严重争用AtomicLong::incrementAndGet表现也degrades

自Log4j 2.5以来,上述代码不再存在(参见LOG4J2-89)。它已被WatchManager类所取代,该类监视配置文件是否已在后台线程中修改。