基于拦截器实现打印日志

<mvc:interceptors>
   <mvc:interceptor>
      <mvc:mapping path="/**"/>
      <bean class="com.chinadrtv.uam.web.interceptors.LogWebHandlerInterceptor" />
   </mvc:interceptor>
</mvc:interceptors>

import java.lang.reflect.Array;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.Map.Entry;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import com.chinadrtv.uam.utils.RequestUUIDHolder;
import com.chinadrtv.uam.utils.StopWatchHolder;


public class LogWebHandlerInterceptor implements HandlerInterceptor {
   /**
    * Logger for this class
    */
private static final Logger logger = LoggerFactory.getLogger(LogWebHandlerInterceptor.class);
   
   private static final String DELIMITERS = ",; \t\n";
   
   private static final String[] DEFAULT_EXCLUDE_STRINGS = {
         "org.springframework", "spring_security", ".FILTERED", "javax.servlet" };
   
   private String[] excludeStrings = DEFAULT_EXCLUDE_STRINGS;
   
   @Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, 
         Object handler) throws Exception {
      if (handler instanceof HandlerMethod) {
         HandlerMethod hm = (HandlerMethod) handler;
         String call = hm.getBean().getClass().getName() + "." + hm.getMethod().getName() + "()";
         logger.info("***** {} ***** Request [{}] for URI ({}).",
               new Object[] { RequestUUIDHolder.get(), call, request.getRequestURI() });
      } else {
         logger.info("***** {} ***** Process for URI ({}).",
               RequestUUIDHolder.get(), request.getRequestURI());
      }
      
      StringBuilder sb = new StringBuilder();
      Iterator<Entry<String, String[]>> iter = request.getParameterMap().entrySet().iterator();
      while (iter.hasNext()) {
         Entry<String, String[]> entry = iter.next();
         write(sb, entry.getKey(), entry.getValue());
      }
      logger.info("***** {} ***** Parameters of request : ({}). ", RequestUUIDHolder.get(), sb.toString());
      
      sb = new StringBuilder();
      for (Enumeration<String> en = request.getAttributeNames(); en.hasMoreElements();) {
         String key = en.nextElement();
         if (isExclude(key))
            continue; // 有非用户字段跳过
write(sb, key, request.getAttribute(key));
      }
      logger.info("***** {} ***** Attributes of request : ({}). ", RequestUUIDHolder.get(), sb.toString());
      
      StopWatchHolder.start();
      return true;
   }

   @Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, 
         Object handler, ModelAndView modelAndView) throws Exception {
      long invokeTime = StopWatchHolder.getTime();
      logger.info("***** {} ***** Invoke method completed in {} ms  ", 
            RequestUUIDHolder.get(), invokeTime);
      StopWatchHolder.reset();
   }

   @Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, 
         Object handler, Exception ex) throws Exception {
      long renderTime = StopWatchHolder.getTime();
      logger.info("***** {} ***** Render view completed in {} ms  ", 
            RequestUUIDHolder.get(), renderTime);
      
      // 页面渲染完成后删除请求上下文的UUID
RequestUUIDHolder.remove();
      StopWatchHolder.remove();
   }
   
   public void setExcludeString(String str) {
      if (StringUtils.isNotEmpty(str)) {
         excludeStrings = org.springframework.util.StringUtils
               .tokenizeToStringArray(str, DELIMITERS, true, true);
      }
   }
   
   // 文本输出
private void write(StringBuilder sb, String key, Object value) {
      sb.append("[");
      sb.append(key);
      sb.append(" : ");
      sb.append(isArray(value) ? writeArray(value) : value);
      sb.append("]");
   }
   
   // 将数组的各个元素值输出
private String writeArray(Object value)    {
      StringBuilder sb = new StringBuilder();
      int length = Array.getLength(value);
      for (int pos = 0; pos < length; pos++) {
         sb.append(Array.get(value, pos));
         sb.append(pos == length -1 ? "" : ",");
      }
      return sb.toString();
   }
   
   // 判断是否是数组
private boolean isArray(Object value) {
      return value != null && value.getClass().isArray();
   }

   // 判断是否是应该排除的字段
private boolean isExclude(String name) {
      for (String key : excludeStrings) {
         if (StringUtils.contains(name, key)) return true;
      }
      return false;
   }
   
}

猜你喜欢

转载自noudisan.iteye.com/blog/2327194