1,通过拦截器拦截所有请求日志
废话少说,直接上代码!
SessionHandlerInterceptor.java
/**
* 全局请求日志拦截器
* @author reyco
*/
public class SessionHandlerInterceptor implements HandlerInterceptor {
protected Logger logger = LoggerFactory.getLogger(getClass());
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {
try {
// 输出参数日志
StringBuilder sb = new StringBuilder();
sb.append("Parameter : ");
Enumeration paramNames = request.getParameterNames();
while (paramNames.hasMoreElements()) {
String paramName = (String) paramNames.nextElement();
String[] paramValues = request.getParameterValues(paramName);
if (paramValues != null) {
String value = "";
for (String s : paramValues) {
if (StringUtils.isBlank(value)) {
value += s;
} else {
value += "," + s;
}
}
sb.append("[" + paramName + ":" + URLDecoder.decode(value) + "]");
}
}
sb.append("cookies : ");
if(request.getCookies() != null) {
for (Cookie c : request.getCookies()) {
sb.append("[" + c.getName() + ":" + URLDecoder.decode(c.getValue()) + "]");
}
}
//请求url
String to = request.getRequestURI();
logger.info("request to " + to + " | " + sb.toString());
} catch (Exception e) {
logger.error(e.getMessage(), e);
}
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
//default not do something
}
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
//default not do something
}
}
拦截器注入:
<!-- 日志拦截器 -->
<bean id="sessionHandlerInterceptor" class="com.reyco.core.interceptor.SessionHandlerInterceptor"/>
<mvc:interceptors>
<ref bean="sessionHandlerInterceptor"/>
</mvc:interceptors>
2,使用aop方式拦截所有请求日志
LogServiceImpl.java
/**
* 日志的实现aop方式
* @author reyco
*/
@Component
@Aspect
public class LogServiceImpl{
protected Logger logger = LoggerFactory.getLogger(getClass());
/**
* 切入点
*/
@Pointcut("execution(* com.reyco.core.controller.*.*(..))")
public void logPointcut() {
// default not do nothing
}
/**
* 前置通知:日志
*/
@Before("logPointcut()")
public void log(JoinPoint point) {
HttpServletRequest request = null;
try {
request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
// 输出参数日志
StringBuilder sb = new StringBuilder();
sb.append("Parameter : ");
Enumeration paramNames = request.getParameterNames();
while (paramNames.hasMoreElements()) {
String paramName = (String) paramNames.nextElement();
String[] paramValues = request.getParameterValues(paramName);
if (paramValues != null) {
String value = "";
for (String s : paramValues) {
if (StringUtils.isBlank(value)) {
value += s;
} else {
value += "," + s;
}
}
sb.append("[" + paramName + ":" + URLDecoder.decode(value) + "]");
}
}
sb.append("cookies : ");
if(request.getCookies() != null) {
for (Cookie c : request.getCookies()) {
sb.append("[" + c.getName() + ":" + URLDecoder.decode(c.getValue()) + "]");
}
}
String to = request.getRequestURI();
logger.info("request to " + to + " | " + sb.toString());
} catch (Exception e) {
logger.error(e.getMessage(), e);
}
}
}
配置文件里开启注解注入:
<!-- aop注解注入 -->
<aop:aspectj-autoproxy/>
注意:aop切点如果放在Controller层,那么开启注解必须在mvc配置文件中,否则aop不生效;如果切点在Service层,注解必须在spring配置文件中,否则,也会不生效。具体什么原因,小编没有深究,感兴趣的朋友可以自己去了解一下。