簡體   English   中英

為什么(在某些情況下)即使禁用了日志記錄級別,logback也不會調用toString()?

[英]Why (in some cases) does logback invoke toString() even though logging level is disabled?

最近,我們在系統中遇到了一個性能問題,即使未為該特定記錄器啟用指定的記錄級別(DEBUG), Logback也會調用toString()。 當然,現在,另外一個問題是我們的toString()方法占用大量CPU,但這是通過logback進行的非常意外的行為。 給定以下簡單測試用例,未指定mypkg.LogTest2的日志級別(默認),我看到toString()被調用了兩次,但沒有打印日志消息(注意:鏈接到logback-classic-0.9.29和logback-core- 0.9.29)。

package mypkg;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class LogTest2 {
   private static Logger ROOT_LOGGER = LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
   private static Logger CLASS_LOGGER = LoggerFactory.getLogger(LogTest2.class);

   public static void main(String[] args){
      LogTest2 obj = new LogTest2();
   }
   public LogTest2() {
      if (CLASS_LOGGER.isDebugEnabled()) {
         ROOT_LOGGER.info("A CLASS_LOGGER debug guarded ROOT_LOGGER info message: {}", this);
         CLASS_LOGGER.debug("A class logger debug message: {}", this);
      }
   }
   public String toString() {
      System.out.println("================= LogTest2 toString invoked.");
      return "{LogTest2}";
   }
}

以上程序的輸出:

================= LogTest2 toString invoked.
================= LogTest2 toString invoked.

為了完整起見,這是我正在使用的logback.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<configuration  scan="true" debug="true">
  <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
    <encoder><pattern>%c -> %msg%n</pattern></encoder>
  </appender>

  <!--  
  <logger name="mypkg" level="debug">  <appender-ref ref="stdout" />  </logger>
  -->
</configuration>

如果我更新上述logback.xml文件以取消對“ mypkg”記錄器的注釋,則輸出會更改,但仍會額外調用toString():

================= LogTest2 toString invoked.
================= LogTest2 toString invoked.
mypkg.LogTest2 -> A class logger debug message: {LogTest2}

這違反了我對slf4j和logback日志應該如何工作的所有理解。 誰能幫我理解這一點? 這是錯誤還是預期的行為(以及原因)?

ROOT記錄器的創建級別為DEBUG。 創建子記錄器后,其有效記錄級別將設置為其父記錄器的有效記錄級別。 另外, isDebugEnabled()檢查Logger的有效日志記錄級別( int值)是否>= isDebugEnabled() DEBUG的值。 在這種情況下,它是相等的,因為它是從ROOT繼承的。

在沒有聲明記錄器的示例中,它也沒有任何附加程序。 消息被構造,但是沒有可登錄的地方。 因此,盡管調試級別確實令人滿意,但它並沒有記錄在任何地方。

在較新版本的logback中,似乎在檢查了附加程序之后日志消息的構造已完成。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM