荒淫来到狗窝

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 }

 

posted @ 2016-08-09 00:41  月·漩涡  阅读(1862)  评论(0)    收藏  举报

荒淫来到狗窝