美文网首页
【日志】SLF4J讲解

【日志】SLF4J讲解

作者: 嘻洋洋 | 来源:发表于2019-02-11 14:18 被阅读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() 基本用不上。

    相关文章

      网友评论

          本文标题:【日志】SLF4J讲解

          本文链接:https://www.haomeiwen.com/subject/hlkssqtx.html