我有以下代码,
public class HttpAdapter extends HttpServlet { private static final long serialVersionUID = 1L; static Logger l = Logger.getLogger(HttpAdapter.class.getName()); public HttpAdapter() { super(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try{ Layout ll = new SimpleLayout(); Appender a = new FileAppender(); a = new FileAppender(ll,"C:\\Users\\Vasanth\\Desktop\\JDlogs\\my.txt"); l.info(request.getRemoteHost()); l.addAppender(a); String loc = DTO.findMyLocation(); l.info(loc); l.info(this.getClass()+" >>>>>>>>>>>>>>task complete"); l.info(request.getRemoteHost()); }catch(Exception e){ e.printStackTrace(); }finally{ getServletContext().getRequestDispatcher("/JSP/done.jsp").forward(request, response); } } //F:\\home\\WorkSpace\\Jdfront1\\webapps\\JSP\\ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } }
这是不寻常的事情:每当我从浏览器通过jsp页面向这个servlet发出请求时,
jdHome
hello!!
当第一次发出请求时,它运行良好,日志也只进行一次,但是当我从jsp向同一个servlet发出第二个请求时,整个程序运行两次.日志来了两次,就像我有一个System.out.println("hello")
,它打印'你好'两次.当我提出第3个请求时,它打印3次然后继续!我曾经在调度员身上找不到我想要转发的东西吗?我到处尝试过,没有类似的问题甚至接近这个问题.
为什么要在doGet()
方法中配置记录器?
正如您所指出的,此方法在每个请求上执行.
但是,您可能只想配置一次记录器和它的appender .这个逻辑的一个更好的地方是Servlet的init方法(这个逻辑的最佳位置是外部XML或属性文件).
您看到日志行的多个副本的原因是,当您收到第四个请求时,您已向记录器添加了四个appender.记录器框架不知道这些appender是彼此重复的,并将日志消息发送给每个appender.