2010-10-07 46 views
2

如果我有一個JDBCAppender配置爲向MySQL 扔日誌消息,並且,當我的系統啓動時,我重新啓動數據庫是否重新連接到數據庫?在log4j內重新連接到DB

回答

1

我有這個用例在過去的週末發生。我的數據庫由Amazon AWS託管。它翻轉了我的日誌數據庫,並且所有通過Log4j JDBC Appender記錄到該數據庫的實例都停止了日誌記錄。我反彈了其中一個應用程序,它恢復了日誌記錄。

所以這個問題的答案,通過經驗,似乎是沒有

如果數據庫關閉並重新聯機,則JDBC appender不會自動重新連接。

編輯

JDBCAppender getConnection可能覆蓋修復。

+0

所以,現在我的問題是,如何解決這個問題。 – MikeNereson 2011-09-06 16:02:39

+0

也許重寫'getConnection()'以確保連接有效。如果不創建新的連接。 – MikeNereson 2011-09-06 16:04:28

0

JDBCAppender中的log4j 1.2.15有以下代碼

protected Connection getConnection() throws SQLException { 
     if (!DriverManager.getDrivers().hasMoreElements()) 
     setDriver("sun.jdbc.odbc.JdbcOdbcDriver"); 

     if (connection == null) { 
     connection = DriverManager.getConnection(databaseURL, databaseUser, 
        databasePassword); 
     } 

     return connection; 
    } 

所以如果連接不爲空,但壞了(需要重新連接)的log4j將返回斷開連接到它的邏輯,並執行它確實記錄到語句數據庫將失敗。

不是一個解決辦法,但一個妥善的解決辦法是用的logback取代log4j的:看到相關的答案:Log to a database using log4j