[slf4j-dev] Appender synchronization
Ralph Goers
ralph.goers at dslextreme.com
Sat Oct 11 06:51:35 CEST 2008
I would have opened a Jira issue for this (I will) but it appears to be
unavailable.
We have run into a serious performance problem with a custom appender.
The appender is not particularly fast and logback ends up being a system
wide bottleneck. This is because the doAppend method of AppenderBase is
synchronzed and Logger's callApenders method calls appendLoopOnAppenders
within a synchronzed block. Synchronized blocks should always be as
small as possible. Synchronizing appender calls is just asking for
trouble. Chapter 4 currently documents this behavior and should be changed.
In my case I can avoid the first issue by having my appender override
doAppend, but this really shouldn't be necessary. It would be much
better to have appenders that aren't thread safe synchronize on the
doAppend method or, better yet, within the method. The guard to avoid
recursion can be handled with a thread local.
As for callAppenders, there is unfortunately no way for me to bypass
this problem without patching logback. java.util.concurrent provides
several ways to avoid this. One would be to replace the synchronization
with a ReadWriteLock. An even better alternative would be to completely
remove the synchronization from Logger and change AppenderAttachableImpl
use a ReadWriteLock to manage access to the appender List.
I will try to work up some patches for these and add them to jira when
they are done and jira is available again.
Ralph
More information about the slf4j-dev
mailing list