2013-04-22 185 views
0

我在這裏查看日誌概述:http://docs.oracle.com/javase/6/docs/technotes/guides/logging/overview.html#1.15 我有以下問題。我創建了一個簡單的Web應用程序,我使用下面的代碼:日誌和服務器控制檯

protected void processRequest(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 
    Logger logger = Logger.getLogger("com.NewServlet.severe"); 
    Logger logger2 = Logger.getLogger("com.NewServlet.Fine"); 
    Handler fh=new FileHandler("/C:/Html/mylogs.txt"); 
    Handler fh2=new FileHandler("/C:/Html/mylogs2.txt"); 
    //Logger.getLogger("com.NewServlet").addHandler(fh); 
    //Logger.getLogger("com.NewServlet.Fine").addHandler(fh2); 
    // Logger.getLogger("com.NewServlet").setLevel(Level.SEVERE); 
    // Logger.getLogger("com.NewServlet.Fine").setLevel(Level.FINE); 
    response.setContentType("text/html;charset=UTF-8"); 
    PrintWriter out = response.getWriter(); 
    String number=request.getParameter("value"); 
    Integer num=Integer.valueOf(number); 
    int a= num.parseInt(number); 
    int result=0; 
    try { 
     /* 
     * TODO output your page here. You may use following sample code. 
     */ 
     result=20/a; 
     out.println("<html>"); 
     out.println("<head>"); 
     out.println("<title>Servlet NewServlet</title>");    
     out.println("</head>"); 
     out.println("<body>"); 
     //logger2.fine("doing stuff"); 
     logger2.addHandler(fh2); 
     logger2.setLevel(Level.FINE); 
     logger2.fine("doing ALL OK"); 
     //logger2.log(Level.FINE,"doing OK"); 
     out.println("<h1>Servlet NewServlet at " + result + "</h1>"); 
     out.println("</body>"); 
     out.println("</html>"); 

    } 
    catch (Exception e1){ 
     logger.addHandler(fh); 
     logger.setLevel(Level.SEVERE); 
     logger.log(Level.SEVERE, "troubles", e1); 
     e1.printStackTrace(); 

    } 

    finally {    
     out.close(); 
    } 
} 

我的問題是所顯示的日誌信息兩次(一個在服務器控制檯,一個在日誌文件中,我能做些什麼使我可以看到消息只有日誌文件,而不是在控制檯?),另一個問題是對於帶有Lever SEVERE的記錄器,我只能在服務器控制檯中看到錯誤消息。已創建的.txt mylogs.txt爲空。爲什麼會發生?

+0

因爲,你正在使用e1.printStackTrace();這將寫入默認爲服務器日誌的控制檯。 – IndoKnight 2013-04-22 09:38:10

回答

0

e1.printStackTrace();將在控制檯中打印堆棧跟蹤。刪除和當您設置記錄器級別打印在日誌文件中的堆棧跟蹤(你已經這樣做)

logger.log(LEVEL, MSG, EXCEPION_OBJECT)

SEVERE [具有最高值],低於所有級別都將被丟棄並且它們不會被打印到文件中。

你的日誌文件擴展名重命名從.txt.log

Handler fh=new FileHandler("/C:/Html/mylogs.log"); 
Handler fh2=new FileHandler("/C:/Html/mylogs2.log"); 
+0

我做到了,當我有一個異常現在everythng工作正常,但是當代碼沒有任何異常logger2是空的,並且服務器控制檯顯示我已經定義在FINE級別的相關消息,這是否合理? – 2013-04-22 10:16:04

+0

因此,如果您能夠在'mylogs2.log'文件中看到'logger2.log()'消息並在'mylogs.log'文件中看到異常消息,那麼事情就很好。 – 2013-04-22 10:20:13