Oh *_*oon 5 java logging log4j slf4j
似乎虽然日志级别设置为INFO,但SLF4J仍在评估表达式.
package com.ab.test.slf4j;
import org.apache.log4j.PropertyConfigurator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class SimpleTest {
static final Logger logger = LoggerFactory.getLogger(SimpleTest.class);
public static void main(String[] args) {
PropertyConfigurator.configure("log4j.properties");
logger.debug("Test " + testEnter());
logger.debug("Test {}", testEnter());
}
public static String testEnter() {
System.out
.println("If you see this it means your expression is evaluated :(");
return "test";
}
}
Run Code Online (Sandbox Code Playgroud)
Log4J属性文件:
log4j.rootLogger=INFO, CA
log4j.appender.CA=org.apache.log4j.ConsoleAppender
log4j.appender.CA.layout=org.apache.log4j.PatternLayout
log4j.appender.CA.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
Run Code Online (Sandbox Code Playgroud)
运行输出:
If you see this it means your expression is evaluated :(
If you see this it means your expression is evaluated :(
Run Code Online (Sandbox Code Playgroud)
编辑:修改了运行输出,如图所示,表达式被计算,但日志消息不是.不应根据SLF4J的"性能记录"评估表达式
它不是slf4j,但JVM需要在函数调用之前计算每个传递的参数.
仔细阅读给定的链接.slf4j只跳过调用toString()获取跳过的日志语句的对象参数.它不适用于跳过函数调用.
但是你可以为此创建自定义函子对象:
logger.debug(new Object() {
@Override
public String toString() {
return "some expensive test data";
}
});
Run Code Online (Sandbox Code Playgroud)
只有在不跳过debug时才会调用toString()方法.
| 归档时间: |
|
| 查看次数: |
704 次 |
| 最近记录: |