日志作为了解系统运行情况的重要信息来源和参考,规范和完整的日志记录是非常重要的。
根据完善的日志记录,可以获取的信息包括但不限于以下:
- 了解应用系统运行性能情况,各个关键业务处理步骤的响应时间,单位时间内的业务处理数量,即系统并发处理请求数量;
- 了解应用系统运行的成功率,业务处理成功,业务处理失败,业务处理异常的数量;
- 了解应用系统处理失败时的输入参数,失败位置,失败原因;
- 了解应用系统处理异常时的输入参数,异常位置,异常原因;
- 了解应用系统业务处理过程中的业务标识信息,比如openid,用户编号,手机号等,需要做敏感信息处理的情况也需要考虑;
根据日志的应用场景,可以分为接口处理日志和内部业务处理日志。
接口日志重点关注的信息包括客户端信息(具体包括ip地址,appid等)和完整的请求参数信息,以及返回给客户端的完整信息。
内部业务处理日志重点关注的信息包括业务标识信息(比如openid,用户编号,手机号,业务编号,订单号等),入参,出参信息;
参考格式:
%d %-5level [%thread][%X{clientIp}][%X{userId}][%X{sessionId}] %logger{68} %line - %msg%n
格式说明:
时间 日志级别 [线程号][客户端IP][客户编号][sessionId] 日志发生类 行号 - 日志详细信息
日志示例:
2016-08-08 11:07:42,142 INFO [http-bio-8090-exec-2][61.175.197.205][2000000000008831][29B2291637E4EE27FB28B8EEE6171F00] c.i.s.order.OrderServiceImpl 87 - 订单创建成功:1000000000202203011012345678
对于通用日志信息,在请求入口处通过拦截器添加到MDC中,在请求处理结束时,清空MDC。
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 添加MDC配置信息
MDC.put(ATTRIBUTE_KEY_HOST_NAME, getRemoteIp(request));
MDC.put(ATTRIBUTE_KEY_USER_ID, "");
MDC.put(ATTRIBUTE_KEY_SESSION_ID, request.getSession().getId());
return super.preHandle(request, response, handler);
}
/*
* 此处ATTRIBUTE_KEY_USER_ID设置为空,在登录拦截器中,在put值进去。MDC中封装了ThreadLocal,线程结束后需要将ThreadLocal内容进行清空。
*/
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
// 清空threadLocal
MDC.clear();
super.afterCompletion(request, response, handler, ex);
}