Hi Jacob,

A bug report with a github pull request would be most welcome.

Best regards,

--
Ceki

On 1/23/2017 16:18, Jakob Bergendahl wrote:
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
        }
    }

to something like (assuming no Guava dependency):

    private void put(E eventObject) {
        if (neverBlock) {
            blockingQueue.offer(eventObject);
        } else {
            putUninterruptibly(eventObject);
        }
    }

    private void putUninterruptibly(E eventObject) {
        boolean interrupted = false;
        try {
            while (true) {
                try {
                    blockingQueue.put(eventObject);
                    break;
                } catch (InterruptedException e) {
                    interrupted = true;
                }
            }
        } finally {
            if (interrupted) {
                Thread.currentThread().interrupt();
            }
        }
    }

Does this make sense? I would be willing to help out with this, but not
sure what my next step should be.

/Jakob


_______________________________________________
logback-user mailing list
[email protected]
http://mailman.qos.ch/mailman/listinfo/logback-user

_______________________________________________
logback-user mailing list
[email protected]
http://mailman.qos.ch/mailman/listinfo/logback-user

Reply via email to