Hi,
As mentioned in a comment on LOGBACK-910, the AsyncAppender will silently drop events when the current thread is interrupted. The simplest test for this is:
Thread.currentThread().interrupt();
log.warn("message 1"); // This was always dropped
log.warn("message 2"); // This is also dropped since LOGBACK-910 was fixed
I have recently spent a long time troubleshooting a case where an error was sometimes not logged because of this. Have you considered using something similar to Guava's Uninterruptibles.putUninterruptibly instead, i.e. try to put in a loop while interrupted and reset the interrupt status once the put succeeds? Code-wise this would mean changing AsyncAppenderBase from:
private void put(E eventObject) {
if (neverBlock) {
blockingQueue.offer(eventObject);
} else {
try {
blockingQueue.put(eventObject);
} catch (InterruptedException e) {
// Interruption of current thread when in doAppend method should not be consumed
// by AsyncAppender
}
}
Does this make sense? I would be willing to help out with this, but not sure what my next step should be.