我想在日志文件中记录RequestHeaders。我做了以下事情:
public class TestServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private static Logger logger = Logger.getLogger("myLogger");
public TestServlet() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
FileHandler fileHandler = new FileHandler("logfile.txt", true);
logger.addHandler(fileHandler);
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String title = "Request Headers";
out.println("<HTML>" +
"<BODY BGCOLOR=\"#FDF5E6\">\n" +
"<H1 ALIGN=CENTER>" + title + "</H1>\n" +
"<B>Request Method: </B>" +
request.getMethod() + "<BR>\n" +
"<B>Request URI: </B>" +
request.getRequestURI() + "<BR>\n" +
"<B>Request Protocol: </B>" +
request.getProtocol() + "<BR><BR>\n" +
"<TABLE BORDER=1 ALIGN=CENTER>\n" +
"<TR BGCOLOR=\"#DGAD00\">\n" +
"<TH>Header Name<TH>Header Value");
Enumeration headerNames = request.getHeaderNames();
while(headerNames.hasMoreElements()) {
String headerName = (String)headerNames.nextElement();
out.println("<TR><TD>" + headerName);
out.println(" <TD>" + request.getHeader(headerName));
}
out.println("</TABLE>\n</BODY></HTML>");
}
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
我收到以下异常: java.io.IOException:无法获取logfile.txt的锁定
我正在使用Tomcat6.0.32和java.util.logging。
答案 0 :(得分:1)
这种添加记录器的方法是错误的。
我打赌在应用程序部署后第一次调用,这是有效的;从第二次起就失败了。为什么?因为每次调用logger.addHandler(fileHandler)
时都会附加另一个处理程序。所以第二次2个处理程序将尝试写入日志文件;第三次三次;等等。幸运的是,处理程序试图锁定文件,因此第一个成功,而后面的文件因异常而失败。如果没有抛出锁定异常,你会看到这样的消息:
1st time
2nd time
2nd time
3rd time
3rd time
3rd time
......等等。
您也有可能无法写入logfile.txt
。
无论如何,解决方案是在适当的配置文件中添加一次处理程序。
如果您希望将标题记录在单独的文件中,请创建一个特定于您需要的类别,将FileHandler
附加到此类别,并在您的servlet日志中附加一个单独的记录器,例如:
private static Logger logger = Logger.getLogger("myLogger");
private static Logger headersLogger = Logger.getLogger("headersLogger");