日志规范(一)

日志规范(一)

记录在首约的工作中遇到的日志需要规范的地方,感谢鑫哥教我这么多规范.

1. 全局查找标识

完整的日志是可以通过日志看到整个代码的流程.这就需要一个全局查找的标识,当我们根据这个标识搜索日志时,可以将代码执行的流程梳理出来,由此可以快速定位出问题,及时修复bug.

eg : 最常见的就是订单号之类

1
LOGGER.info("根据订单号查询优惠券id orderNo:{} response:{}", orderNo, response);

2. Http请求

  • 调用Http请求时将调用的url和参数输出出来,这样可以避免由于接口或参数配置错误导致无法联调成功.
  • 同时接口的返回值也要打输出出来,这样可以避免接口返回值格式错误导致的异常.
  • 调用接口的响应时间也要输出,调用接口的响应时间大大影响了自身接口的性能,因此输出接口响应时间是非常必要的.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public void cancelOrderFee(Order order) {
long startTime = System.currentTimeMillis();
String orderNo = order.getOrderNo();
try {
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("customerId", order.getBookingUserId());
paramMap.put("phone", order.getBookingUserPhone());
paramMap.put("orderNo", orderNo);
LOGGER.info("退还指定司机费 orderNo:{} url:{} param:{}", orderNo, REFUND_CANCELORDER_FEE_URL, paramMap);
String response = HttpUtil.getIntance().post(REFUND_CANCELORDER_FEE_URL, paramMap);
LOGGER.info("退还指定司机费 orderNo:{} 接口响应:{}", orderNo, response);
if (StringUtils.isNotBlank(response)) {
ResponseResult responseResult = JsonUtils.fromJson(response, ResponseResult.class);
if (ResponseResult.SUCCESS_CODE == responseResult.getCode()) {
int data = (int) responseResult.getData();
if (0 == data) {
LOGGER.info("退还指定司机费[成功] orderNo:{}", orderNo);
} else {
LOGGER.error("退还指定司机费[失败] orderNo:{} 失败原因:{}", orderNo, responseResult.getMsg());
}
} else {
LOGGER.error("退还指定司机费[失败] orderNo:{} 接口调用失败 失败原因:{}", orderNo, responseResult.getMsg());
}
} else {
LOGGER.error("退还指定司机费[失败] orderNo:{} 接口返回值错误 response:{}", orderNo, response);
}
} catch (Exception e) {
LOGGER.error("退还指定司机费[异常] orderNo:{} 异常信息:", orderNo, e);
} finally {
LOGGER.info("退还指定司机费 orderNo:{} 接口耗时:{}ms", orderNo, System.currentTimeMillis() - startTime);
}
}

3. 查询结果数组或集合输出个数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
List<OrderTasks> unArrivedOrders = orderTaskService.getUnArrivedOrders();
if (unArrivedOrders != null && unArrivedOrders.size() > 0) {
LOGGER.info("定时任务-订单自动取消逻辑 listSize:" + unArrivedOrders.size() + " threadId:" + threadId);
for (OrderTasks orderTasks : unArrivedOrders) {
try {
CarFactOrderMongo order = carFactOrderSlaveMapper.selectVOByOrderNo(orderTasks.getOrderNo());
if (order != null && StringUtils.isNotBlank(order.getRiderPhone()) && orderTaskService.validCityAndServiceType(order)) {
LOGGER.info("定时任务-订单自动取消逻辑-将要执行取消 orderNo:" + order.getOrderNo() + " threadId:" + threadId);
orderTaskService.cancelOrder(order, orderTasks.getNotArraiveCancelPeriod());
} else {
LOGGER.info("定时任务-订单自动取消逻辑-条件不满足 orderNo:" + order.getOrderNo());
}
} catch (Exception e) {
LOGGER.error("定时任务-订单自动取消逻辑-异常 orderNo:" + orderTasks.getOrderNo() + " threadId:" + threadId, e);
}
}
}

4. 定时任务需要打印线程Id

1
2
long threadId = Thread.currentThread().getId();
LOGGER.info("定时任务-订单自动取消逻辑-job start threadId:{}", threadId);