日志要做到便于检索,不要打印不体现具体业务的日志
// 反例
logger.info("定时任务开始执行");
// 正例
logger.info("批量转换制度文件定时任务开始执行");
划重点:便于检索是打印日志的重中之重!!!便于检索,才容易定位问题。
打印了足够多的日志,但是难以检索,定位问题依然很难。
对于逻辑较复杂的方法,每实现一个小功能,就打日志说明
// 反例
public void method() {
// function1...
...
logger.info("调用API成功");
// function2...
...
logger.info("文件转换成功");
}
// 正例
public void method() {
// function1...
...
logger.info("调用查询舆情API成功");
// function2...
...
logger.info("制度文件转换成功");
}
对于有多个退出条件的方法,每一个退出条件都打日志说明
// 反例
public void method() {
if (condition1) {
logger.info("没有需要转换的文件");
return ;
}
...
if (condition2) {
logger.info("没有需要更新的数据");
return ;
}
}
// 正例
public void method() {
if (condition1) {
logger.info("没有需要转换的制度文件");
return ;
}
...
if (condition2) {
logger.info("没有需要更新的舆情数据");
return ;
}
}
打印异常堆栈信息时,附加信息不能为空,否则很难检索
// 反例
logger.error("", e);
logger.error("数据入库异常", e);
// 正例
logger.error("舆情数据入库异常", e);
不要因为toString方法导致日志遗漏关键信息
如果没有重写toString方法,会继承父类的toString方法,不会打印子类的属性,需要重写toString()方法;
如果使用lombok生成的toString方法,只打印子类属性,不会打印父类属性,解决办法是使用@ToString(callSuper = true)
对于关键方法,一定要有开始和结束方法的日志,否则难以判断该方法是否正常开始和结束
如有需要,for循环中每一次循环结束后打印日志,否则无法定位某一次循环是否执行成功,打印的日志需要有标识信息,以便定位到具体是哪一次循环出了问题
// 反例
for (...) {
try {
...
} catch (Exception e) {
LOG.info("message commit offset fail ", e);
}
}
// 正例
for (...) {
try {
...
} catch (Exception e) {
LOG.info("message commit offset fail, partition: {}, offset: {}", record.partition(), record.offset(), e);
}
}
网友评论