logback日志格式规范
原文链接:logback日志格式规范
日志格式规范设定如下:
参考文章【logback日志分类收集配置】
%d %-5level [%thread][%X{hostName}][%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.product.SeriesServiceImpl 87 - 转让产品总数缓存清除:2000000000008831
其中配置中%X是日志框架从本地线程变量中获取的,需要在程序入口中将变量进行设置,具体实现可以参考如下(使用MDC作为本地线程变量框架):
针对spring-mvc的web项目,在入口处定义拦截器,拦截器继承【org.springframework.web.servlet.handler.HandlerInterceptorAdapter】
在preHandle中,在MDC中加入需要日志打印的变量
1 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 2 3 // 添加MDC配置信息 4 5 MDC.put(ATTRIBUTE_KEY_HOST_NAME, getRemoteIp(request)); 6 7 MDC.put(ATTRIBUTE_KEY_USER_ID, ""); 8 9 MDC.put(ATTRIBUTE_KEY_SESSION_ID, request.getSession().getId()); 10 11 return super.preHandle(request, response, handler); 12 13 } 14 15 此处ATTRIBUTE_KEY_USER_ID设置为空,在登录拦截器中,在put值进去。MDC中封装了ThreadLocal,线程结束后需要将ThreadLocal内容进行清空。 16 17 public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { 18 19 // 清空threadLocal 20 21 MDC.clear(); 22 23 super.afterCompletion(request, response, handler, ex); 24 25 } 26 27
完整代码如下:
1 public class IfaexLogMdcIntercepter extends HandlerInterceptorAdapter { 2 3 4 5 private static final Logger LOGGER = LoggerFactory.getLogger(IfaexLogMdcIntercepter.class); 6 7 8 9 public static final String ATTRIBUTE_KEY_HOST_NAME = "hostName"; 10 11 12 13 public static final String ATTRIBUTE_KEY_USER_ID = "userId"; 14 15 16 17 public static final String ATTRIBUTE_KEY_SESSION_ID = "sessionId"; 18 19 20 21 public static final String ATTRIBUTE_KEY_REQUEST_STARTTIME = "requestStartTime"; 22 23 24 25 @Override 26 27 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 28 29 30 31 // 添加MDC配置信息 32 33 MDC.put(ATTRIBUTE_KEY_HOST_NAME, getRemoteIp(request)); 34 35 MDC.put(ATTRIBUTE_KEY_USER_ID, ""); 36 37 MDC.put(ATTRIBUTE_KEY_SESSION_ID, request.getSession().getId()); 38 39 MDC.put(ATTRIBUTE_KEY_REQUEST_STARTTIME, String.valueOf(System.currentTimeMillis())); 40 41 return super.preHandle(request, response, handler); 42 43 } 44 45 46 47 @Override 48 49 public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { 50 51 // 记录日志 52 53 logRequest(request); 54 55 // 清空threadLocal 56 57 MDC.clear(); 58 59 super.afterCompletion(request, response, handler, ex); 60 61 } 62 63 64 65 /** 66 67 * 打印请求日志 68 69 * @param request 70 71 * @author Silver 72 73 * @date 2016年2月1日 上午9:17:39 74 75 */ 76 77 78 79 private void logRequest(HttpServletRequest request) { 80 81 82 83 StringBuffer logBuffer = new StringBuffer(128); 84 85 86 87 // refer_url 88 89 logBuffer.append("referUrl:"); 90 91 92 93 @SuppressWarnings("rawtypes") 94 95 Enumeration e = request.getHeaders("Referer"); 96 97 String referUrl; 98 99 if (e.hasMoreElements()) { 100 101 referUrl = (String) e.nextElement(); 102 103 } else { 104 105 referUrl = "直接访问"; 106 107 } 108 109 logBuffer.append(referUrl); 110 111 // 获取url 112 113 logBuffer.append(";URL:"); 114 115 StringBuffer url = request.getRequestURL(); 116 117 if (url != null) { 118 119 StringUtils.replaceOnce(url.toString(), "http://", "https://"); 120 121 } 122 123 logBuffer.append(url.toString()); 124 125 // 判断用户请求方式是否为ajax 126 127 logBuffer.append(";ISAJAX:"); 128 129 String requestType = request.getHeader("X-Requested-With"); 130 131 if (StringUtils.isNotBlank(requestType) && requestType.equals("XMLHttpRequest")) { 132 133 logBuffer.append("true"); 134 135 } else { 136 137 logBuffer.append("false"); 138 139 } 140 141 //获取所有参数 142 143 StringBuffer paramBuffer = new StringBuffer(64); 144 145 Enumeration<?> enu = request.getParameterNames(); 146 147 while (enu.hasMoreElements()) { 148 149 String paraName = (String) enu.nextElement(); 150 151 paramBuffer.append(paraName); 152 153 paramBuffer.append(": "); 154 155 paramBuffer.append(request.getParameter(paraName)); 156 157 paramBuffer.append(", "); 158 159 } 160 161 logBuffer.append(";Parameters:"); 162 163 logBuffer.append(paramBuffer.toString()); 164 165 166 167 // 记录本次请求耗时: 168 169 Long requestEndTime = System.currentTimeMillis(); 170 171 Long requestStartTime = StringUtils.isEmpty(MDC.get(ATTRIBUTE_KEY_REQUEST_STARTTIME)) ? requestEndTime : Long.valueOf(MDC.get(ATTRIBUTE_KEY_REQUEST_STARTTIME)); 172 173 174 175 logBuffer.append(";COST:"); 176 177 logBuffer.append(requestEndTime - requestStartTime); 178 179 logBuffer.append(" ms"); 180 181 if (!"HEAD".equals(request.getMethod())) { 182 183 LOGGER.info("requestLog:" + logBuffer.toString()); 184 185 } 186 187 188 189 } 190 191 192 193 /** 194 195 * 拦截器获取IP 196 197 * @param request 198 199 * @return 200 201 */ 202 203 protected String getRemoteIp(HttpServletRequest request) { 204 205 206 207 String remoteIp = null; 208 209 remoteIp = request.getHeader("x-forwarded-for"); 210 211 if (remoteIp == null || remoteIp.isEmpty() || "unknown".equalsIgnoreCase(remoteIp)) { 212 213 remoteIp = request.getHeader("X-Real-IP"); 214 215 } 216 217 if (remoteIp == null || remoteIp.isEmpty() || "unknown".equalsIgnoreCase(remoteIp)) { 218 219 remoteIp = request.getHeader("Proxy-Client-IP"); 220 221 } 222 223 if (remoteIp == null || remoteIp.isEmpty() || "unknown".equalsIgnoreCase(remoteIp)) { 224 225 remoteIp = request.getHeader("WL-Proxy-Client-IP"); 226 227 } 228 229 if (remoteIp == null || remoteIp.isEmpty() || "unknown".equalsIgnoreCase(remoteIp)) { 230 231 remoteIp = request.getHeader("HTTP_CLIENT_IP"); 232 233 } 234 235 if (remoteIp == null || remoteIp.isEmpty() || "unknown".equalsIgnoreCase(remoteIp)) { 236 237 remoteIp = request.getHeader("HTTP_X_FORWARDED_FOR"); 238 239 } 240 241 if (remoteIp == null || remoteIp.isEmpty() || "unknown".equalsIgnoreCase(remoteIp)) { 242 243 remoteIp = request.getRemoteAddr(); 244 245 } 246 247 if (remoteIp == null || remoteIp.isEmpty() || "unknown".equalsIgnoreCase(remoteIp)) { 248 249 remoteIp = request.getRemoteHost(); 250 251 } 252 253 if (remoteIp == null || remoteIp.isEmpty()) { 254 255 remoteIp = "unknown"; 256 257 } 258 259 String[] ipArray = remoteIp.split(","); 260 261 if (ipArray != null && ipArray.length > 1) { 262 263 return ipArray[0]; 264 265 } 266 267 return ("0:0:0:0:0:0:0:1").equals(remoteIp) ? "127.0.0.1" : remoteIp; 268 269 } 270 271 }

浙公网安备 33010602011771号