[英]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.