page contents

程序员注意!别在Java代码里乱打日志了

使用slf4j 使用门面模式的日志框架,有利于维护和各个类的日志处理方式统一实现方式统一使用: Logback框架 打日志的正确方式 什么时候应该打日志? 当你遇到问题的时候,只能通过debug功...

使用slf4j

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

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


打日志的正确方式

什么时候应该打日志?

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

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

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


基本格式

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

logger.debug("Processingtradewithid:[{}]andsymbol:[{}]",id,symbol);


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

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


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

反例(不要这么做):


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


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

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


logger.debug("Processingtradewithid:[{}]andsymbol:[{}]",id,symbol);


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


不同级别的使用

1. ERROR

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

  • 打开配置文件失败

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

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


不应该出现的情况:比如要使用Azure传图片,但是Azure未响应。

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


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


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

反例(不要这么做):

程序员注意!别在Java代码里乱打日志了,这才是正确的打日志姿势



2. WARN

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

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

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

即将接近临界值的时候,例如:缓存池占用达到警告线。

业务异常的记录,比如:当接口抛出业务异常时,应该记录此异常。


3. INFO

系统运行信息

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

  • 主要逻辑中的分步骤


外部接口部分

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

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


A. 并不是所有的service都进行出入口打点记录,单一、简单service是没有意义的(job除外,job需要记录开始和结束,)。

反例(不要这么做):

程序员注意!别在Java代码里乱打日志了,这才是正确的打日志姿势


B. 对于复杂的业务逻辑,需要进行日志打点,以及埋点记录,比如电商系统中的下订单逻辑,以及OrderAction操作(业务状态变更)。

C. 对于整个系统的提供出的接口(REST/WS),使用info记录入参。

D. 如果所有的service为SOA架构,那么可以看成是一个外部接口提供方,那么必须记录入参。

E. 调用其他第三方服务时,所有的出参和入参是必须要记录的(因为你很难追溯第三方模块发生的问题)。


4. DEBUG

基本概念:

  • 可以填写所有的想知道的相关信息(但不代表可以随便写,debug信息要有意义,最好有相关参数)

  • 生产环境需要关闭DEBUG信息

  • 如果在生产情况下需要开启DEBUG,需要使用开关进行管理,不能一直开启。


如果代码中出现以下代码,可以进行优化:

//1. 获取用户基本薪资//2. 获取用户休假情况//3. 计算用户应得薪资


优化后的代码:

程序员注意!别在Java代码里乱打日志了,这才是正确的打日志姿势


5. TRACE

特别详细的系统运行完成信息,业务代码中,不要使用(除非有特殊用意,否则请使用DEBUG级别替代)。

规范示例说明:

程序员注意!别在Java代码里乱打日志了,这才是正确的打日志姿势

程序员注意!别在Java代码里乱打日志了,这才是正确的打日志姿势


  • 发表于 2019-12-30 11:32
  • 阅读 ( 667 )
  • 分类:Java开发

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
Pack
Pack

1135 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1312 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章