diff --git a/README.md b/README.md index c83b895..d4f2f2b 100755 --- a/README.md +++ b/README.md @@ -1103,8 +1103,88 @@ AS 已帮你集成了一些注释模板,我们只需要直接使用即可, 22. 最后不要忘了内存泄漏的检测; - ---- +24. 日志规范; + 什么时候记录日志 + 系统初始化 + 业务流程 + 组件关键动作 + 1.日志文件 + 记录I级别日志到本地 + 3.错误日志 +2.6.2 日志级别 +日志的输出都是分级别的,不同的设置不同的场合打印不同的日志。 + +主要使用如下的四个级别: + +DEBUG:DEUBG 级别的主要输出调试性质的内容,该级别日志主要用于在开发、测试阶段输出。该级别的日志应尽可能地详尽,开发人员可以将各类详细信息记录到 DEBUG 里,起到调试的作用,包括参数信息,调试细节信息,返回值信息等等,便于在开发、测试阶段出现问题或者异常时,对其进行分析。 + +INFO:INFO 级别的主要记录系统关键信息,旨在保留系统正常工作期间关键运行指标,开发人员可以将初始化系统配置、业务状态变化信息,或者用户业务流程中的核心处理记录到INFO日志中,方便日常运维工作以及错误回溯时上下文场景复现。建议在项目完成后,在测试环境将日志级别调成 INFO,然后通过 INFO 级别的信息看看是否能了解这个应用的运用情况,如果出现问题后是否这些日志能否提供有用的排查问题的信息。 + +WARN:WARN 级别的主要输出警告性质的内容,这些内容是可以预知且是有规划的,比如,某个方法入参为空或者该参数的值不满足运行该方法的条件时。在 WARN 级别的时应输出较为详尽的信息,以便于事后对日志进行分析。 + +ERROR:ERROR 级别主要针对于一些不可预知的信息,诸如:错误、异常等,比如,在 catch 块中抓获的网络通信、数据库连接等异常,若异常对系统的整个流程影响不大,可以使用 WARN 级别日志输出。在输出 ERROR 级别的日志时,尽量多地输出方法入参数、方法执行过程中产生的对象等数据,在带有错误、异常对象的数据时,需要将该对象一并输出。 + +目前logcat有level、time、pid、application、tag、text这五个元素,现在我们要规范好tag和text这2个元素,其他的不变 +Tag:统一使用当前的类名命名,定义静态成员变量不要使用getSimpleName()方法,考虑到混淆会增加日志tag会变成无意义的字符,不利用阅读 + +常用 +的有 4 个 DEBUG、INFO、WARN、ERROR,生产系统一般只打印 INFO 级别以上的日 +志信息,对于 DEBUG 级别的日志,只在测试环境中打印。 + +● 应用中绝对不允许直接使用 System.out 或 System.err 输出日志或使用 +e.printStackTrace()打印异常堆栈,也不允许使用 STDOUT、STDERR 作为 +Logger 名字。由于标准日志输出与标准错误输出文件每次 Jboss 重启时才滚动, +因此,如果大量输出送往这两个文件,容易造成文件大小超过操作系统大小限制。 +● 日志消息中不允许出现用户密码、短信验证码、支付验证码、身份证号、银行卡号 +等敏感信息。 +● 循环体内禁止打印 INFO 级别日志,如果数据量过大会造成日志文件过大,导致排 +查问题不方便。 +● 不要在不同地方重复记录针对同一事件的日志消息。 +● Catch 块中的异常记录必须堆栈信息打印出来。 +● 不记录对于排查故障毫无意义的日志信息,如:logger.error(“系统未知错 +误”,e); logger.info(“开始发送请求…”);日志信息一定要带有业务信息。 +● 打印错误日志时,需要区分是业务异常(如:用户名不能为空)还是系统异常(如:调用 +会员核心异常),业务异常使用 warn 级别记录,系统异常使用 error 记录。避免 +error 日志过大,影响紧急故障排查。 + + +1.1.6. 日志打印例子 +● DEBUG 级日志: +if (logger.isDebugEnabled()) { +logger.debug("准备获取文件信息:bankId=" + bankId + ":bizDate=" + bizDate); +} +if (logger.isDebugEnabled()) { + logger.debug("准备获取文件信息:"+fileObject); +} +● INFO 级日志: +logger.info(Thread.currentThread().getId() + ":卡通协议:接收到卡通协议签约请求:" + +signInfo); +logger.info("开始处理卡通协议签约请求:" + signInfo); +● WARN 级日志: +logger.warn("非法卡通协议操作类型: status =" + status); +● ERROR 级日志: +logger.error("获取不到对应的卡通协议校验器:" + agreementInfo); +错误形式 +try { + ……… +} catch (Exception e) { + logger.error("清算层调用异常", e); + return false; +} +try { + ……… +} catch (Exception e) { + logger.error("清算层调用异常"+e); + return false; +} +正确形式 +try { + ……… +} catch (Exception e) { +logger.error("清算层调用异常 +channelApi="+channelApi+”:serialNO=”+serialNo, e); + return false; +} 最后啰嗦几句: