我将记录器设置为INFO级别,并运行了以下测试:
@Test
void loggerTest() {
System.out.println("START " + LocalDateTime.now());
System.out.println("TRACE: " + LocalDateTime.now());
log.trace("{}", sleepAndReturnString(5000L, "TRACE PRINT"));
System.out.println("DEBUG: " + LocalDateTime.now());
log.debug("{}", sleepAndReturnString(5000L, "DEBUG PRINT"));
System.out.println("INFO: " + LocalDateTime.now());
log.info("{}", sleepAndReturnString(5000L, "INFO PRINT"));
System.out.println("WARN: " + LocalDateTime.now());
log.warn("{}", sleepAndReturnString(5000L, "WARN PRINT"));
System.out.println("ERROR: " + LocalDateTime.now());
log.error("{}", sleepAndReturnString(5000L, "ERROR PRINT"));
System.out.println("END " + LocalDateTime.now());
}
public static String sleepAndReturnString(long millis, String message) {
try {
Thread.sleep(millis);
} catch (InterruptedException e) {
log.error("", e);
}
return message;
}
logback.xml 文件:
<configuration>
<property name="MY__PATTERN"
value="%d{yyyy-MM-dd HH:mm:ss.SSS} | %highlight(%-5level) | %message%n%rEx"/>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<outputPatternAsHeader>true</outputPatternAsHeader>
<pattern>${MY__PATTERN}</pattern>
</encoder>
</appender>
<root level="info">
<appender-ref ref="CONSOLE"/>
</root>
这是在控制台中打印的内容:
START 2023-01-20T11:17:57.255
TRACE: 2023-01-20T11:17:57.255
DEBUG: 2023-01-20T11:18:02.256
INFO: 2023-01-20T11:18:07.262
2023-01-20 11:18:12.267 | INFO | INFO PRINT
WARN: 2023-01-20T11:18:12.283
2023-01-20 11:18:17.285 | WARN | WARN PRINT
ERROR: 2023-01-20T11:18:17.285
2023-01-20 11:18:22.287 | ERROR | ERROR PRINT
END 2023-01-20T11:18:22.287
正如我们所看到的,每次线程休眠5秒钟,尽管TRACE和DEBUG消息没有打印到控制台。这表明使用isLevelEnabled是合理的,并且可以提高性能。
entry
是昂贵的时候,字符串格式化无法提供帮助。例如,考虑一些类似于logger.debug("The new entry is {}.", getEntry());
的代码,你不知道getEntry()
方法需要花费多少成本。 - xmedeko