为什么log4j-slf4j-impl不是无锁的?

问题描述 投票:0回答:1

我在我们的应用程序中在slf4j上使用了Async log4j2,并且我确定这是非阻塞的。但是整合BlockHound之后,我得到了一个惊喜:

java.lang.Exception: [worker-1-8] Blocking call: sun.misc.Unsafe#park
 at reactor.blockhound.BlockHound$Builder.lambda$install$6(BlockHound.java:318)
 at reactor.blockhound.BlockHoundRuntime.checkBlocking(BlockHoundRuntime.java:46)
 at sun.misc.Unsafe.park(Unsafe.java)
 at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
 at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:836)
 at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:870)
 at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1199)
 at java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:209)
 at java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:285)
 at com.lmax.disruptor.TimeoutBlockingWaitStrategy.signalAllWhenBlocking(TimeoutBlockingWaitStrategy.java:62)
 at com.lmax.disruptor.MultiProducerSequencer.publish(MultiProducerSequencer.java:218)
 at com.lmax.disruptor.RingBuffer.translateAndPublish(RingBuffer.java:990)
 at com.lmax.disruptor.RingBuffer.tryPublishEvent(RingBuffer.java:538)
 at org.apache.logging.log4j.core.async.AsyncLoggerConfigDisruptor.tryEnqueue(AsyncLoggerConfigDisruptor.java:392)
 at org.apache.logging.log4j.core.async.AsyncLoggerConfig.logToAsyncDelegate(AsyncLoggerConfig.java:135)
 at org.apache.logging.log4j.core.async.AsyncLoggerConfig.log(AsyncLoggerConfig.java:116)
 at org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:460)
 at org.apache.logging.log4j.core.config.AwaitCompletionReliabilityStrategy.log(AwaitCompletionReliabilityStrategy.java:82)
 at org.apache.logging.log4j.core.Logger.log(Logger.java:162)
 at org.apache.logging.log4j.spi.AbstractLogger.tryLogMessage(AbstractLogger.java:2190)
 at org.apache.logging.log4j.spi.AbstractLogger.logMessageTrackRecursion(AbstractLogger.java:2144)
 at org.apache.logging.log4j.spi.AbstractLogger.logMessageSafely(AbstractLogger.java:2127)
 at org.apache.logging.log4j.spi.AbstractLogger.logMessage(AbstractLogger.java:2020)
 at org.apache.logging.log4j.spi.AbstractLogger.logIfEnabled(AbstractLogger.java:1891)
 at org.apache.logging.slf4j.Log4jLogger.info(Log4jLogger.java:184)

这是预期的行为还是我缺少什么?

java log4j2 slf4j project-reactor lock-free
1个回答
0
投票

Log4j2的异步日志记录只是通过中断器(一种环形缓冲区)将I / O部分移交给单独的线程。生产者使用Java的内置notify()向消费者发出信号,后者必须获取锁。

© www.soinside.com 2019 - 2024. All rights reserved.