log4j asyncappender线程与主线程一起死亡

时间:2014-08-06 10:05:01

标签: java asynchronous jdbc log4j

我创建了一个测试应用程序来使用log4j jdbcAppender和asyncAppender记录事件。在while循环中,我使用asyncAppender记录500条错误消息,问题是当记录消息的线程完成后,asyncAppender线程也会停止将消息记录到数据库中。

<appender name="async" class="org.apache.log4j.AsyncAppender">
        <param name="Threshold" value="ERROR"/>
        <param name="bufferSize" value="1"/> 
        <param name="blocking" value="false"/>
        <appender-ref ref="test_db"/> 
    </appender>

我们的想法是将错误记录到数据库而不会阻塞。将阻塞设置为true会记录所有消息,但会使主线程等待记录。关于解决方案的任何想法?

bufferSize设置为1,这样它每次都会将消息记录到数据库中,原因是db上有一个警报系统来检查错误数量等等。我还更改了jdbcAppender使用连接池而不是与每个日志事件打开连接。

感谢。

更新: jdbc appender

<appender name="test_db" class="com.test.pooled.log4j.jdbcappender.PooledJDBCAppender"> <!-- EXTENDS JDBCAPPENDER TO USE CONNECTION POOL INSTEAD! -->
        <param name="Threshold" value="ERROR"/>
        <param name="URL" value="jdbc:mysql://localhost:3306/~removed~"/>
        <param name="Driver" value="com.mysql.jdbc.Driver"/>
        <param name="User" value="~removed~"/>
        <param name="Password" value="~removed~"/>
        <layout class="org.apache.log4j.PatternLayout"> 
            <param name="ConversionPattern" 
                   value="INSERT INTO ~removed this detail~
             /> 
        </layout>
    </appender>

1 个答案:

答案 0 :(得分:0)

使用关机钩,如doc所述:

<configuration debug="true">
   <!-- in the absence of the class attribute, assume 
   ch.qos.logback.core.hook.DefaultShutdownHook -->
   <shutdownHook/>
  .... 
</configuration>