【日志】SLF4J讲解

2019-02-11  本文已影响0人  嘻洋洋

1.工作中遇到问题

工作发现之前的代码异常日志有问题,没有把异常的信息打印出来。打印日志的代码:

//输出异常名称
logger.info(ex.getMessage());
//输出堆栈信息
logger.error("system error resolve Exception", ex);

查看日志的时候,发现分别输出""和system error resolve Exception。异常名称和堆栈信息都没有输出来。

2.SLF4J输出规范

(1)非异常日志输出
trace/debug/info级别的日志输出,必须使用条件输出形式或者使用占位符{}的方式。占位符是一个非常类似于在String的format()方法中的%s,因为它会在运行时被某个提供的实际字符串所替换。这不仅降低了你代码中字符串连接次数,而且还节省了新建的String对象。

logger.debug("Processing trade with id: {} and symbol : {} ", id, symbol);
logger.debug("Processing trade with id: " + id + " and symbol: " + symbol)

如果日志级别是warn或info,上述日志不会打印,但是会执行字符串拼接操作,如果symbol是对象,会执行toString()方法,浪费了系统资源,执行了上述操作,最终日志却没有打印。 使用条件输出形式也可以解决这种问题:

if (logger.isDebugEnabled()) {

logger.debug("Processing trade with id: " + id + " and symbol: " + symbol);

}

(2)异常日志输出
对于异常,是不需要占位符的,而且也不需要e.getMessage(),直接打印出来即可。使用log.error方法输出

//打印出异常名称和印堆栈信息
log.error("测试 ",e);
//只会打印出异常名称,不会打印堆栈信息
log.error("测试:" +e); 

3.SLF4J详解用法

下面具体介绍日志输出常见的一些代码。

    @Test
    public void testExcept(){
        File file = new File("E:\\study\\text.txt");
        FileReader fr  = null;
        try{
            fr= new FileReader(file);
        }catch (FileNotFoundException e) {
            log.error("测试 : ",e.getMessage());
            log.error("测试 :"+e.getMessage());
            log.error("测试 :"+e);
            log.error("测试 : ",e);
            e.printStackTrace();
        }
    }

经过代码分析,ex.getMessage()的值不空(E:\study\text.txt (系统找不到指定的路径))。按照上面顺序解释:
(1)不会打印任何异常信息(容易犯的错误)。
(2)只打印异常名称的一部分:异常的详细消息字符串。
(3)只会打印出异常名称。
(4)打印出异常名称和印堆栈信息
因此:e.getMessage() 基本用不上。

上一篇 下一篇

猜你喜欢

热点阅读