2010-10-07 87 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