log4j 将web请求 日志输入到数据库
最近做的项目出现了某些功能打开太慢的问题,为了方便统计并优化,想到可以在系统中加个拦截器,记录每个请求的处理时间,并打印耗时,结合log4j ,将日志如初到数据库,方便进行统计。
首先创建自己的拦截器:
package com.tera.sys.filter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
import org.springframework.core.NamedThreadLocal;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import org.apache.log4j.MDC;
/**
* 日志拦截器
* @author sun
* @version 2018-9-21
*/
public class LogInterceptor implements HandlerInterceptor {
private final static Logger logger = Logger.getLogger("LogInterceptor");
private static final ThreadLocal<Long> startTimeThreadLocal =
new NamedThreadLocal<Long>("ThreadLocal StartTime");
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object handler) throws Exception {
if (logger.isDebugEnabled()){
long beginTime = System.currentTimeMillis();//1、开始时间
startTimeThreadLocal.set(beginTime); //线程绑定变量(该数据只有当前请求的线程可见)
}
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
if (modelAndView != null){
logger.info("ViewName: " + modelAndView.getViewName());
}
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response,
Object handler, Exception ex) throws Exception {
if (logger.isDebugEnabled()){
long beginTime = startTimeThreadLocal.get();//得到线程绑定的局部变量(开始时间)
long endTime = System.currentTimeMillis(); //2、结束时间
MDC.put("url",request.getRequestURI());
logger.debug( endTime - beginTime );
}
}
}
在sping 配置文件中新增如下配置:
<mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**"/>
<!-- 拦截器不需要拦截的路径-->
<mvc:exclude-mapping path="/static/**" />
<bean class="com.tera.sys.filter.LogInterceptor"/> </mvc:interceptor> </mvc:interceptors>
说明:
1)mvc:mapping 拦截器路径配置
2)mvc:exclude-mapping 拦截器不需要拦截的路径
如果提示没有mvc,则需要在beans 里增加mvc,我的配置如下:
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:task="http://www.springframework.org/schema/task" xmlns:jee="http://www.springframework.org/schema/jee" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd ">
红色 部分即为mvc配置。
下面配置log4j.properties
log4j.logger.LogInterceptor = DEBUG, LogInterceptor # Define the DB appender log4j.appender.LogInterceptor=org.apache.log4j.jdbc.JDBCAppender # Set JDBC URL log4j.appender.LogInterceptor.URL=jdbc:mysql://127.0.0.1:3306/test # Set Database Driver log4j.appender.LogInterceptor.driver=com.mysql.jdbc.Driver # Set database user name and password log4j.appender.LogInterceptor.user=root log4j.appender.LogInterceptor.password=root # Set the SQL statement to be executed. log4j.appender.LogInterceptor.sql=INSERT INTO %d{yyyyMM}LOGS VALUES('%X{url}','%d{yyyy-MM-dd HH:mm:ss}','%C','%p','%m') # Define the layout for file appender log4j.appender.LogInterceptor.layout=org.apache.log4j.PatternLayout
其中表名是按月分的变量,例如201809LOGS,后面的 '%X{url}'是获取拦截器中定义的url,对应
MDC.put("url",request.getRequestURI());

浙公网安备 33010602011771号