Java日志框架——Logback的使用注意

在一个项目中,有很多地方使用日志记录操作,我们应该关注日志记录操作相关的性能问题。
有这样的一个应用场景:欲记录的内容不是纯字符串,而是有包含其他类型的内容,比如"'My Age Is'+age",其中age是一个Integer类型对象。
具体代码如下:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


public class Main {


    public static void main(String[] args) {
        Logger logger = LoggerFactory.getLogger(Main.class);
        Integer age = 24;
        // 这里以debug方法举例,也可以替换成trace,info,warn,error方法
        logger.debug("My Age Is" + age);
    }
}

备注:以上代码片段中的logger对象指向的是ch.qos.logback.classic.Logger类型对象,执行logger.debug("My Age Is" + age)语句,真正执行的是ch.qos.logback.classic.Logger上的debug方法


在以上代码片段中,logger.debug("My Age Is" + age)语句执行的过程中,至多有3个性能消耗点,至少有2个性能消耗点。具体是:
1)调用age.toString()方法,得到一个纯字符串,以匹配"public void debug(String msg){}"的方法声明
2)比较日志记录请求的Level值(这里为debug)和Logger实例的Level值,判断该日志记录请求是否有效

3)第2步骤中判断结果有效的情况下,具体的日志记录操作;第2步骤中判断结果无效的情况下,无操作


有两种优化方案:
一、采用isDebugEnabled()方法
具体代码如下:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


public class Main {


    public static void main(String[] args) {
        Logger logger = LoggerFactory.getLogger(Main.class);
        Integer age = 24;
        // 这里以debug方法举例,也可以替换成trace,info,warn,error方法
        if (logger.isDebugEnabled())
            logger.debug("My Age Is" + age);
    }
}
在以上代码片段中,if (logger.isDebugEnabled()) logger.debug("My Age Is" + age)语句执行的过程中,至多有4个性能消耗点,至少有1个性能消耗点。具体是:
1)查看Logger实例的Level值,判断debug Level的日志记录请求是否有效
2)第1步骤判断结果为无效的情况下,那么直接退出,无任何操作;否则,调用age.toString()方法,得到一个纯字符串,以匹配"public void debug(String msg){}"的方法声明
3)比较日志记录请求的Level值(这里为debug)和Logger实例的Level值,判断该日志记录请求是否有效
4)第3步骤判断结果有效的情况下,具体的日志记录操作;第3步骤判断结果无效的情况下,无操作


二、采用debug(String var1, Object var2)方法

具体代码如下:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


public class Main {


    public static void main(String[] args) {
        Logger logger = LoggerFactory.getLogger(Main.class);
        Integer age = 24;
        // 这里以debug方法举例,也可以替换成trace,info,warn,error方法
        logger.debug("My Age Is {}", age);
    }
}
在以上代码片段中,logger.debug("My Age Is {}", age)语句执行的过程中,至多有3个性能消耗点,至少有1个性能消耗点。分别是:
1)比较日志记录请求的Level值(这里为debug)和Logger实例的Level值,判断该日志记录请求是否有效
2)第1步骤的判断结果为无效的情况下,直接退出,无任何操作;否则,调用age.toString()方法,得到一个纯字符串,
3)具体的日志记录操作


参考文献:
[1]http://logback.qos.ch/manual/architecture.html
[2]http://blog.csdn.net/dslztx/article/details/47450741

你可能感兴趣的:(Java日志框架——Logback的使用注意)