tomcat - 使用 Tomcat6 和 Servlet 登录时无法获取锁定

标签 tomcat servlets logging

我想在日志文件中记录 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。

最佳答案

这种添加记录器的方法是错误的。

我敢打赌,在部署应用程序后第一次调用时,这是有效的;从第二次开始它失败了。为什么?因为每次调用 logger.addHandler(fileHandler) 时,都会附加另一个处理程序。所以第二次 2 个处理程序将尝试写入日志文件;第三次三;等等。幸运的是,处理程序尝试锁定文件,因此第一个成功,而后一个失败并出现异常。如果没有抛出锁定异常,您将看到如下消息:

1st time
2nd time
2nd time
3rd time
3rd time
3rd time

...等等。

也有可能您没有权限写入 logfile.txt

无论如何,解决方案是在适当的配置文件中添加一次处理程序。

如果您希望 header 记录在单独的文件中,请创建一个特定于您的需求的类别,将 FileHandler 附加到该类别,并在您的 servlet 中记录一个单独的记录器,例如:

private static Logger logger = Logger.getLogger("myLogger");
private static Logger headersLogger = Logger.getLogger("headersLogger");

关于tomcat - 使用 Tomcat6 和 Servlet 登录时无法获取锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20247233/

相关文章:

java - 尝试从 JSP 页面调用 servlet 时出现严重的 : Allocate exception for servlet, 错误

java mybatis isTraceEnabled()Z错误

java - 如何检查 Java.util.logging 中启用的信息日志级别

java - java web应用的协同编辑算法

java - 在 spring boot 项目中构建后 server.port 属性不起作用

java - 如何编写从tomcat运行的java批处理

java - 解锁锁定同步块(synchronized block)的可靠方法

jsp - 使用 Java EE 的网站

java - 如何在不离开页面的情况下从 servlet 返回一个字符串?

java - CXF:如何使用wsdl2java生成@Logging注释?