【发布时间】:2014-08-06 10:05:00
【问题描述】:
我创建了一个测试应用程序来使用 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 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>
【问题讨论】:
-
显示
JDBCAppender的配置? -
你是如何测试它的?如果
AsyncAppender在一个守护线程中运行,它会在所有非守护线程都完成后死掉。 -
jdbc appender 添加。使用基本的测试应用程序对其进行测试以记录一些错误消息。
-
@Kayaman 所以如果我有一个创建线程 A 和线程 B 的应用程序,并且 A 将 500 条错误消息记录到异步附加程序然后停止但线程 B 仍在运行,那么异步附加程序是否会停止线程 A 还是会因为线程 B 仍在运行而继续记录?
-
如果线程 B 是非守护进程并且异步记录器线程是守护进程,那么是的。
标签: java asynchronous jdbc log4j