首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Tomcat6和Servlet登录时无法获得锁

使用Tomcat6和Servlet登录时无法获得锁
EN

Stack Overflow用户
提问于 2013-11-27 16:00:21
回答 1查看 669关注 0票数 0

我想将RequestHeaders记录在日志文件中。我做了以下工作:

代码语言:javascript
复制
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。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-27 16:15:58

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

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

代码语言:javascript
复制
1st time
2nd time
2nd time
3rd time
3rd time
3rd time

...and等。

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

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

如果希望将头记录在单独的文件中,则创建一个特定于您需要的类别,将FileHandler附加到此类别,并在servlet日志中添加单独的记录器,例如:

代码语言:javascript
复制
private static Logger logger = Logger.getLogger("myLogger");
private static Logger headersLogger = Logger.getLogger("headersLogger");
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20247233

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档