2010-05-06 67 views
3

我最近繼承了2002年寫回的J2EE Struts Web應用程序。除了奇怪的System.out.println()之外,沒有在應用程序中進行日誌記錄。
我已經添加了log4j日誌記錄,以便我可以向控制檯寫出一些信息,但我很關心如何最好地處理這個問題。任何建議,技巧和最佳實踐都會受到歡迎,因爲我不想花費太多時間將日誌記錄添加到每個方法或類中(或試圖找到日誌記錄最好的地方 - 即錯誤的代碼塊/缺陷)。
我目前的做法是隻添加一些日誌記錄到我一直在尋找的幾個類來理解代碼,但是有幾個關鍵的地方可以添加日誌記錄以最大化地使用添加log4j?如何實現log4j日誌記錄到現有的J2EE Struts Web應用程序?

編輯:
的最新進展:
我擴展了Struts(第1節)ExceptionHandler並配置了struts-config.xml使用我的CustomExceptionHandler而不是Struts的版本。然後通過重寫​​方法,我添加了一些邏輯來使用log4j來記錄異常。請看下圖:

public class CustomExceptionHandler extends ExceptionHandler { 

static Logger logger = Logger.getLogger(CustomExceptionHandler.class); 

public ActionForward execute(Exception ex, ExceptionConfig ae, ActionMapping mapping, ActionForm formInstance, HttpServletRequest request, HttpServletResponse response) throws ServletException { 
    logException(ex); 
    return super.execute(ex, ae, mapping, formInstance, request, response); 
} 

private void logException(Throwable thr) { 
    // Add code here to log the exception appropiately 
    // i.e. logger.error("Exception is: " + ex.getMessage()); 
} 

的struts-config.xml文件必須被更新:

<global-exceptions>
<exception key="" type="java.lang.Throwable" handler="com.mycompany.CustomExceptionHandler" />
</global-exceptions>

現在我可以肯定,我會永遠appropiately記錄任何異常。
對於已越來越吃進去的例外,我包起來unchecked異常,讓他們使其頂端:

 
} catch (Exception e) { 
//nothing here 
} 

更改爲:

 
} catch (Exception e) { 
throw new RuntimeException(e); 
}

回答

2

最重要的事情是,我願意在struts-config.xml中設置一個Struts異常處理程序,以捕捉從操作中拋出的所有內容並記錄下來。然後,我會檢查所有的異常處理,看看有什麼異常被獲取,寫入標準輸出,否則不會進入日誌,並進行更改,以便每一個無法處理的異常都得到傳播(包裝在未選中狀態如果有必要的話就會有異常),這樣它就會將它傳遞給異常處理程序

除此之外,我會像你描述的那樣,將記錄添加到直接有用的部分。只要異常被拋出並且進入異常處理程序,就不應該做太多的事情。

+0

至於你的第一個建議,你的意思是這樣的:<全球異常><例外鍵=「」類型=「java.lang.Throwable中的」處理程序=「com.mycompany.CustomHandler」 /> Ruepen 2010-05-07 15:04:26

+0

是的,就像那樣。有一個StrutsExceptionHandler是struts-1發行版的一部分,唯一錯誤的是它將所有內容記錄爲DEBUG。 – 2010-05-07 16:04:28

+0

當你說「必要時包裝在非檢查異常中」時,你的意思是: catch(IOException e){0} {0}拋出new RuntimeException(e); (例外e){ throw new RuntimeExcpetion(e); } 我在代碼中看到,有不少如下: 趕上(例外五){// 這裏沒什麼} 是 – Ruepen 2010-05-11 13:45:13

0

如果打算到System.out(System.err的)的唯一事情是舊記錄和你正在尋找一個簡單的解決方案,你總是可以重定向的System.out的包裝類圍繞一個記錄器在啓動您的應用程序的生命週期:

public class LoggerStream extends PrintStream { 
    Logger legacyLogger = Logger.getLogger("app.legacyLogger"); 

    ... 

    public void println(String s){ 
    legacyLogger.log(s); 
    } 
} 

覆蓋任何其他方法,如打印等,這可能不會產生最漂亮的輸出,但你可以使用它作爲一個「快速修復」開始,然後取代傳統的有更多記錄適當的日誌記錄,因爲您發現更感興趣的項目

+0

@ M.Jessup - 感謝您的建議,但System.out似乎已在2005年加入,當有人需要在他們正在修復的類中看到一些輸出時。它並不是普遍用於記錄。我沒有考慮過包裝類,但我會在下一次記住它。 – Ruepen 2010-05-10 15:21:59

相關問題