package com.aggrepoint.winlet.plugin; import java.util.Enumeration; import java.util.HashSet; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.view.JstlView; import com.aggrepoint.winlet.ContextUtils; import com.aggrepoint.winlet.LogInfo; import com.aggrepoint.winlet.ReqConst; import com.aggrepoint.winlet.ReqInfo; import com.aggrepoint.winlet.RequestLogger; import com.aggrepoint.winlet.UserProfile; import com.aggrepoint.winlet.spring.def.ReturnDef; import com.aggrepoint.winlet.utils.EncodeUtils; /** * * @author Jiangming Yang (yangjm@gmail.com) */ public class DefaultRequestLogger implements RequestLogger { static final HashSet<String> SYSTEM_PARAMS; static { SYSTEM_PARAMS = new HashSet<String>(); for (String str : new String[] { ReqConst.PARAM_PAGE_PATH, ReqConst.PARAM_PAGE_URL, ReqConst.PARAM_WIN_ACTION, ReqConst.PARAM_WIN_PARAM, ReqConst.PARAM_WIN_VALIDATE_FIELD, ReqConst.PARAM_WIN_VALIDATE_FIELD_VALUE }) SYSTEM_PARAMS.add(str); } @Override public void log(LogInfo log) { if (log.getHandler() instanceof HandlerMethod) { HandlerMethod hm = (HandlerMethod) log.getHandler(); Logger logger = LoggerFactory.getLogger(hm.getBeanType()); StringBuffer sb = new StringBuffer(); // request id sb.append("| "); sb.append(log.getRequestId()); // processed time sb.append(" | "); sb.append(log.getEnd() - log.getStart()); // request ip sb.append(" | "); String ip = log.getRequest().getHeader("X-Forwarded-For"); sb.append(ip == null ? log.getRequest().getRemoteAddr() : ip); // reqinfo ReqInfo ri = log.getReqInfo(); addUser(sb, ContextUtils.getUser(ri.getRequest())); if (ri != null) { sb.append(" | "); sb.append(ri.getPageId()); } // handler object & method sb.append(" | "); sb.append(hm.getBean()); sb.append("."); sb.append(hm.getMethod().getName()); sb.append("()"); // return view sb.append(" | "); if (log.getModelAndView() != null) sb.append(log.getModelAndView().getViewName()); sb.append(" | "); org.springframework.web.servlet.View view = log.getView(); if (view != null && view instanceof JstlView) sb.append(((JstlView) view).getUrl()); // log message sb.append(" | "); if (log.getReturnDef() != null) sb.append(log.getReturnDef().getLog()); // request url sb.append(" | "); sb.append(log.getRequest().getRequestURL()); addParams(sb, log.getRequest(), log.getReturnDef()); addCookies(sb, log.getRequest()); if (log.getException() != null) logger.error(EncodeUtils.logMessage(sb.toString()), log.getException()); else logger.info(EncodeUtils.logMessage(sb.toString()), log.getException()); } } protected void addUser(StringBuffer sb, UserProfile user) { sb.append(" | "); if (user.isAnonymous()) sb.append("[ANONYMOUS]"); else sb.append(user.getLoginId()); } protected void addCookies(StringBuffer sb, HttpServletRequest req) { sb.append(" | "); Cookie[] ck = req.getCookies(); if (ck != null) for (int i = 0; i < ck.length; i++) { sb.append(ck[i].getName()); sb.append("="); sb.append(ck[i].getValue()); sb.append(";"); } else sb.append(" "); } protected String getParameter(HttpServletRequest req, String name) { String[] values = req.getParameterValues(name); if (values == null || values.length == 0) return ""; if (values.length == 1) return values[0]; StringBuffer sb = new StringBuffer(); sb.append("["); for (int i = 0; i < values.length; i++) { if (i > 0) sb.append(", "); sb.append(values[i]); } sb.append("]"); return sb.toString(); } protected void addParams(StringBuffer sb, HttpServletRequest req, ReturnDef def) { sb.append(" | "); HashSet<String> logExclude = null; if (def != null) logExclude = def.getLogExclude(); boolean bFirst = true; for (Enumeration<String> e = req.getParameterNames(); e .hasMoreElements();) { String name = e.nextElement(); if (SYSTEM_PARAMS.contains(name)) continue; if (logExclude != null && logExclude.contains(name)) continue; if (bFirst) bFirst = false; else sb.append(", "); sb.append(name).append("=").append(getParameter(req, name)); } } }