package org.quickbundle.project.listener; import java.lang.reflect.InvocationTargetException; import javax.servlet.ServletRequest; import javax.servlet.http.HttpServletRequest; import org.quickbundle.config.RmBaseConfig; import org.quickbundle.tools.helper.RmStringHelper; import org.quickbundle.tools.helper.RmUUIDHelper; import org.quickbundle.tools.support.log.RmLogHelper; import org.slf4j.Logger; public class RmRequestMonitor { /** * 把每次的Request绑定到当前线程 */ public static final ThreadLocal<ServletRequest> tlCurrentRequest = new ThreadLocal<ServletRequest>(); //request统计的Logger private static final Logger logRequest = RmLogHelper.getLogger("rmrequest"); //request统计的Logger,用于控制台输出 private static final Logger logRequest2 = RmLogHelper.getLogger("rmrequest2"); /** * 绑定的sql数量 * new long[]{普通SQL数, 批更新次数, 批更新SQL数, SQL执行累计时间} */ public static final ThreadLocal<long[]> tlSqlCount = new ThreadLocal<long[]>(); /** * 功能: 获取当前线程的HttpServletRequest(request)对象 * * @return */ public static HttpServletRequest getCurrentThreadRequest() { ServletRequest request = RmRequestMonitor.tlCurrentRequest.get(); if(request == null) { return null; } else if(request instanceof HttpServletRequest) { return (HttpServletRequest)request; } else { throw new RuntimeException("request:" + request.getClass() + ", not supported!"); } } /** * 功能: 输出请求执行时间和sql数量的日志 * * @param thisClass * @param request */ public static void logTlSqlCount(HttpServletRequest request) { long executeTime = -1l; if(RmGlobalMonitor.uniqueUUID.get() != null) { long startTime = RmUUIDHelper.getTimestamp(RmGlobalMonitor.uniqueUUID.get()); long nowUUID = RmUUIDHelper.getSysTimestamp(); executeTime = (nowUUID - startTime) /10000; } long[] sqlCount = tlSqlCount.get(); StringBuilder sb = new StringBuilder(); sb.append(System.currentTimeMillis()); sb.append("|"); sb.append(executeTime); sb.append(","); //记录sql执行总时间 if(sqlCount != null) { sb.append(sqlCount[3]); } else { sb.append("0"); } sb.append("|"); //记录sql批次和sql数量 if(sqlCount != null) { sb.append(sqlCount[0]); sb.append(","); sb.append(sqlCount[1]); sb.append(","); sb.append(sqlCount[2]); } else { sb.append("0,0,0"); } sb.append("|"); sb.append(RmGlobalMonitor.getShortUniqueUUID()); sb.append("."); sb.append(Thread.currentThread().getId()); { sb.append("."); String user = getRmLoginId(request); if(user != null) { sb.append(user); } } sb.append("|"); sb.append(request.getRequestURI()); if(request.getParameter("cmd") != null) { sb.append("?cmd="); sb.append(request.getParameter("cmd")); } sb.append("|"); String qs = ""; if(request.getQueryString() != null) { qs = request.getQueryString(); qs = RmStringHelper.encode2Encode(qs, "iso8859-1", RmBaseConfig.getSingleton().getDefaultEncode()); } sb.append(qs); if (request.getAttribute("org.apache.struts.action.EXCEPTION") != null) { Exception exception = (Exception) request.getAttribute("org.apache.struts.action.EXCEPTION"); sb.append("|"); sb.append(exception.getClass().getName()); sb.append(":"); sb.append(exception.getMessage() != null ? exception.getMessage().trim() : ""); } String sbStr = sb.toString().replaceAll("[\\r\\n]+", " "); logRequest.debug(sbStr); //if(sqlCount != null && (sqlCount[0] > 0 || sqlCount[1] > 0)) { logRequest2.debug(sbStr); //} } static String getRmLoginId(HttpServletRequest request) { Class clz = null; Object loginId = null; try { clz = Class.forName("org.quickbundle.project.RmProjectHelper"); loginId = clz.getMethod("getRmLoginId", ServletRequest.class, boolean.class).invoke(clz, new Object[]{request, false}); } catch (ClassNotFoundException e) { throw new RuntimeException(e); } catch (IllegalArgumentException e) { throw new RuntimeException(e); } catch (SecurityException e) { throw new RuntimeException(e); } catch (IllegalAccessException e) { throw new RuntimeException(e); } catch (InvocationTargetException e) { throw new RuntimeException(e); } catch (NoSuchMethodException e) { throw new RuntimeException(e); } return loginId != null ? loginId.toString() : null; } }