这两天一直在设法实现使用过滤器处理日志记录。
在web.xml中的配置如下:
我们知道,对于客户端的每一个request,web容器都会根据web.xml的配置内容,先使用配置的filter进行处理,然后交付到对应的controller去处理。
我这里想实现的就是,利用web.xml里面配置的filter。首先,记录来访者的IP和要访问的资源。然后,再把request交付给对应的controller去处理,实现来访信息记录。
其中,日志功能使用了log4j对应的jar:slf4j-api.jar和slf4j-log4j.jar两个。
编写的filter的代码如下:
package test;
import org.apache.log4j.*;
import java.io.IOException;
import javax.servlet.*;
import javax.servlet.http.*;
/**
* Created with IntelliJ IDEA.
* Date: 13-7-6
* Time: 上午10:34
* To change this template use File | Settings | File Templates.
*/
public class Filter_Log implements Filter {
//declare a object of Log
private Logger log = LogManager.getLogger(this.getClass());
//declare a variable named fileName, to represent the name of the current Filter
private String fileName;
public void init(FilterConfig config) throws ServletException {
// get the name of Filter, and assigned to filterName
fileName = config.getInitParameter("logDate");
// String realPath = config.getServletContext().getRealPath(fileName);
System.out.print(fileName);
FileAppender fileAppender = null;
SimpleLayout simpleLayout = new SimpleLayout();
//set to load log when start
try {
fileAppender = new FileAppender(simpleLayout,fileName,true);
log.addAppender(fileAppender);
log.setLevel((Level)Level.DEBUG);
log.info("start Filter bla bla bla "+fileName);
} catch (IOException e) {
System.out.print("error exists!!!!bla bla");
log.error("file not found",e);
}
log.info("start Filter: bla bla bla "+fileName);
}
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException{
//
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
long startTime = System.currentTimeMillis();
String requestURI = request.getRequestURI();
requestURI = request.getQueryString() == null ?requestURI:(requestURI + "?" + request.getQueryString());
chain.doFilter(request,response);
long endTime = System.currentTimeMillis();
log.info(request.getRemoteAddr() + " access " + requestURI + ", total time is " + (endTime - startTime) + " millionseconds");
}
public void destroy (){
log.info("close filter: alb alb alb "+fileName);
}
}
在web.xml中的配置如下:
<filter>
<filter-name>Log</filter-name>
<filter-class>test.Filter_Log</filter-class>
<init-param>
<param-name>logDate</param-name>
<param-value>LogDate.txt</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Log</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
然后,编写一个前台页面index.jsp.。内容随意了。
现在,问题来了:LogDate.txt文件到底在哪里????
答案是:你的JVM的bin目录下。这个还望大神们给个解释,小弟这厢有礼了!!!
另外,如果web.xml里面配置的是/LogDate.txt的话。LogDate.txt文件又是在哪里呢
答案是:你的C盘根目录。同志们,有疑问的可以自己实践一下!!!
个人配置如下:
OS:windows XP SP2
web容器:Apache Tomcat/7.0.27
IDE:Intellij IDEA12.1.3
别的配置信息,就木有值得一提的了。
PS:当前的所有测试是在Intellij IDEA12.1.3中直接运行本地tomcat7.0服务器,并部署项目时的测试结果。
实际部署在tomcat服务器上的时候
当把项目文件拷贝到tomcat的webapps\XXX\中时,
<init-param> <param-name>logDate</param-name> <param-value>LogDate.txt</param-value> </init-param>
此时,LogDate.txt是在tomcat的bin所在的那层目录下<init-param> <param-name>logDate</param-name> <param-value>/LogDate.txt</param-value> </init-param>
此时LogDate.txt是在当前盘符的根目录下