Ste*_*ker 5 java sql-server logging log4j2 dbcp
我用 2.14.0 和 2.13.3 对此进行了测试,我将 JDBC Appender 与 DynamicThresholdFilter 结合使用,并尝试了普通的 Logger 和 AsyncLogger。
在 JDBC Appender 中,我还尝试了 PoolingDriver 和 ConnectionFactory 方法。
事实证明,由于 Log4j2,线程没有并行启动。
使用 AsyncLogger 甚至使情况变得更糟,因为输出表示 Appender 未启动,并且在 15.000 条预期日志中,数据库中只有 13.517 条。
为了重现这个问题,我做了一个 github repo 在这里看到:https : //github.com/stefanwendelmann/Log4j_JDBC_Test
编辑
我用 h2db 替换了 mssql-jdbc,并且线程不会阻塞。JMC 自动分析说有JdbcDatabaseManager 的锁定实例。
我的 mssql-jdbc 的 PoolableConnectionFactory 中是否存在任何配置问题,或者 dbcp/jdbc 驱动程序池是否存在一般问题?
编辑 2
在 Apaches LOGJ2 Jira 上创建票证:https ://issues.apache.org/jira/browse/LOG4J2-3022
编辑 3
为 mssql 和 h2:file 添加了更长的飞行记录
我在 MySQL 数据库上进行了测试,发现锁定了以下方法:
org.apache.logging.log4j.core.appender.db.AbstractDatabaseManager.write(org.apache.logging.log4j.core.LogEvent, java.io.Serializable) (line: 261)
Run Code Online (Sandbox Code Playgroud)
因为在源代码中你可以看到 write 方法的同步:
org.apache.logging.log4j.core.appender.db.AbstractDatabaseManager.write(org.apache.logging.log4j.core.LogEvent, java.io.Serializable) (line: 261)
Run Code Online (Sandbox Code Playgroud)
我认为如果您指定缓冲区大小,它将增加吞吐量,因为日志将被分批收集,并且同步会非常低。
使用更新 log4j2 配置文件后,AsyncLogger您将看到锁定:
org.apache.logging.log4j.core.async.AsyncLoggerConfigDisruptor.enqueue(org.apache.logging.log4j.core.LogEvent, org.apache.logging.log4j.core.async.AsyncLoggerConfig) (line: 375)
Run Code Online (Sandbox Code Playgroud)
以及该方法的实现:
/**
* This method manages buffering and writing of events.
*
* @param event The event to write to the database.
* @param serializable Serializable event
*/
public final synchronized void write(final LogEvent event, final Serializable serializable) {
if (isBuffered()) {
buffer(event);
} else {
writeThrough(event, serializable);
}
}
Run Code Online (Sandbox Code Playgroud)
synchronizeEnqueueWhenQueueFull默认情况下true,它会在线程上产生锁,您可以管理这些参数:
org.apache.logging.log4j.core.async.AsyncLoggerConfigDisruptor.enqueue(org.apache.logging.log4j.core.LogEvent, org.apache.logging.log4j.core.async.AsyncLoggerConfig) (line: 375)
Run Code Online (Sandbox Code Playgroud)
但您应该了解使用这些参数的副作用,如代码片段中所述。
为什么数据库会成为瓶颈?:
| 归档时间: |
|
| 查看次数: |
245 次 |
| 最近记录: |