联系我们 | 加入收藏

 
当前位置:首页 > IT资讯 > 正文
卓越分享丨别在 Java 代码里乱打日志了,这才是打印日志的正确姿势!
时间:2019/12/9 8:46:12来源:沈阳中软阅读:377

本文来源:http://t.cn/E9BkD7a


使用slf4j


  1. 使用门面模式的日志框架,有利于维护和各个类的日志处理方式统一

  2. 实现方式统一使用: Logback框架


打日志的正确方式


什么时候应该打日志


  1. 当你遇到问题的时候,只能通过debug功能来确定问题,你应该考虑打日志,良好的系统,是可以通过日志进行问题定为的。

  2. 当你碰到if…else 或者 switch这样的分支时,要在分支的首行打印日志,用来确定进入了哪个分支

  3. 经常以功能为核心进行开发,你应该在提交代码前,可以确定通过日志可以看到整个流程


基本格式


必须使用参数化信息的方式:


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


对于debug日志,必须判断是否为debug级别后,才进行使用:


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


不要进行字符串拼接,那样会产生很多String对象,占用空间,影响性能。

反例(不要这么做):


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


使用[]进行参数变量隔离

如有参数变量,应该写成如下写法:


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


这样的格式写法,可读性更好,对于排查问题更有帮助。


不同级别的使用


ERROR:


基本概念


影响到程序正常运行、当前请求正常运行的异常情况:


  1. 打开配置文件失败

  2. 所有第三方对接的异常(包括第三方返回错误码)

  3. 所有影响功能使用的异常,包括:SQLException和除了业务异常之外的所有异常(RuntimeException和Exception)


不应该出现的情况:


  1. 比如要使用Azure传图片,但是Azure未响应


如果有Throwable信息,需要记录完成的堆栈信息:


log.error("获取用户[{}]的用户信息时出错",userName,e);


说明

如果进行了抛出异常操作,请不要记录error日志,由最终处理方进行处理:

反例(不要这么做):


try{
   ....
}catch(Exception ex){
 String errorMessage=String.format("Error while reading information of user [%s]",userName);
 logger.error(errorMessage,ex);
 throw new UserServiceException(errorMessage,ex);
}


WARN


基本概念


不应该出现但是不影响程序、当前请求正常运行的异常情况:


  1. 有容错机制的时候出现的错误情况

  2. 找不到配置文件,但是系统能自动创建配置文件


即将接近临界值的时候,例如:


  1. 缓存池占用达到警告线


业务异常的记录,比如:


  1. 当接口抛出业务异常时,应该记录此异常


INFO:


基本概念


系统运行信息


  1. Service方法中对于系统/业务状态的变更

  2. 主要逻辑中的分步骤


外部接口部分


  1. 客户端请求参数(REST/WS)

  2. 调用第三方时的调用参数和调用结果


下一篇:视频剪辑运营师:玩转光影艺术,点亮职业人生