【51CTO.com原创稿件】前言
写代码的人就没有不写日志的,但我们究竟该怎样打印日志,打印日志能不能有点章法?
针对这个成绩,我查阅了《阿里巴巴Java开发手册》,外面有 8 条日志规约。比如不同作用的日志寄存到不同的日志文件里,以 appName_logType_logName.log 方式停止命名。是挺不错,但属于是日志分类的成绩,照旧处置不了顺序员如何有章法的在代码中书写日志的成绩。
探寻
先来看一个比较常见的日志打印示例:
log.info("末尾执行业务逻辑 ----------------->{}",param);
log.info("业务逻辑执行中 ----------------->{}",param);
log.info("完毕执行业务逻辑 ----------------->{}",param);
log.error("业务执行异常 ----------------->{}",param, e);
这种日志打印有什么成绩?
第一、没有绑定事情
在执行什么业务逻辑呢?没有一个明白的事情,或许说是名字、归类,我更愿称之为事情。我们搜索日志时,是要有一个主语的,假设在日志打印中参加事情,我们搜索日志时,只需求输入关键字即可获取该事情的一切日志。改良后的⽇志打印:
log.info("{}|末尾执行业务逻辑 ----------------->{}",EVENT_NAME, param);
log.info("{}|业务逻辑执行中 ----------------->{}",EVENT_NAME, param);
log.info("{}|完毕执行业务逻辑 ----------------->{}",EVENT_NAME, param);
log.error("{}|业务执行异常 ----------------->{}",EVENT_NAME, param, e);
第二、没有绑定主键
一个事情下的日志无时无刻不在产生,而发作成绩时,往往只会给你一个 case 停止诊断,所以,我们除了记载事情,还需求记载主键,经过察看这个主键在执行进程中都产生了哪些日志来定位成绩。改良后的日志打印:
log.info("{}|ID={}|末尾执行业务逻辑 ----------------->{}",EVENT_NAME, ID, param);
log.info("{}|ID={}|业务逻辑执行中 ----------------->{}",EVENT_NAME, ID, param);
log.info("{}|ID={}|完毕执行业务逻辑 ----------------->{}",EVENT_NAME, ID, param);
log.error("{}|ID={}|业务执行异常 ----------------->{}",EVENT_NAME, ID, param, e);
第三、没有绑定央求
有了事情,有了主键,但是在查询日志的进程中,发现该主键产生了许多重复日志,日志的上下文不连接,我们想看某一次央求产生的延续日志就十分不方便,这时分就需求思索并发的状况。改良后的日志打印:
// 可以运用 UUID 生成ReqId
// final String ReqId = UUID.randomUUID().toString();
log.info("{}|ReqId={}|ID={}|末尾执行业务逻辑 ----------------->{}",EVENT_NAME, ReqId, ID, param);
log.info("{}|ReqId={}|ID={}|业务逻辑执行中 ----------------->{}",EVENT_NAME, ReqId, ID, param);
log.info("{}|ReqId={}|ID={}|完毕执行业务逻辑 ----------------->{}",EVENT_NAME, ReqId, ID, param);
log.error("{}|ReqId={}|ID={}|业务执行异常 ----------------->{}",EVENT_NAME, ReqId, ID, param, e);
第四、没有绑定分词符
不要在日志打印时运用 --- 这种分隔符,没意义、不标准,十分不好做分词。一定要将不变的文字阐明和变化的参数用分词符分开打印,由于不变的文字阐明也是可以成为关键词停止搜索的。改良后的日志打印:
log.info("{}|ReqId={}|ID={}|末尾执行业务逻辑|参数={}",EVENT_NAME, ReqId, ID, param);
log.info("{}|ReqId={}|ID={}|业务逻辑执行中|参数={}",EVENT_NAME, ReqId, ID, param);
log.info("{}|ReqId={}|ID={}|完毕执行业务逻辑|参数={}",EVENT_NAME, ReqId, ID, param);
log.error("{}|ReqId={}|ID={}|业务执行异常|参数={}",EVENT_NAME, ReqId, ID, param, e);
第五、错误日志需求输入异常信息
关于异常日志的打印一定要带上堆栈信息,异常堆栈不能运用 e.printStackTrace() 输入到控制台,这样异常堆栈是写入不了日志文件的,需求将异常对象写进最后的参数里,这点置信大家都懂。
(责任编辑:admin)