logging-log4j-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Remko Popma (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (LOG4J2-1518) Deadlock when using pure async and toString logs another message
Date Sun, 21 Aug 2016 00:28:20 GMT

    [ https://issues.apache.org/jira/browse/LOG4J2-1518?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15429543#comment-15429543
] 

Remko Popma commented on LOG4J2-1518:
-------------------------------------

Leon, I finally took a closer look at this and I see now that this is a Log4j2 issue, not
a Disruptor issue.

The [DefaultAsyncQueueFullPolicy|https://github.com/apache/logging-log4j2/blob/d00c38dddf6a3c90a29c14a73ba1f9e56bbbf0b9/log4j-core/src/main/java/org/apache/logging/log4j/core/async/DefaultAsyncQueueFullPolicy.java]
assumes that the {{toString}} method is only invoked from the background thread. Some changes
in log4j-2.6 mean that this is no longer the case.

One way to fix this is to let DefaultAsyncQueueFullPolicy always send the event directly to
the appender ({{return EventRoute.SYNCHRONOUS}}) unconditionally when the queue is full.

You don't need to wait for the next log4j2 release to address this. You can provide a custom
policy like the below and configure log4j to use it by specifying system property {{-Dlog4j2.AsyncQueueFullPolicy=com.mypackage.MyQueueFullPolicy}}.

{code}
package com.mypackage;
public class MyQueueFullPolicy implements AsyncQueueFullPolicy {
    @Override
    public EventRoute getRoute(final long backgroundThreadId, final Level level) {
        return EventRoute.SYNCHRONOUS;
    }
}
{code}


> Deadlock when using pure async and toString logs another message
> ----------------------------------------------------------------
>
>                 Key: LOG4J2-1518
>                 URL: https://issues.apache.org/jira/browse/LOG4J2-1518
>             Project: Log4j 2
>          Issue Type: Bug
>    Affects Versions: 2.6.2
>         Environment: Solaris
>            Reporter: Leon Finker
>            Assignee: Remko Popma
>             Fix For: 2.7
>
>         Attachments: 10511.jstack, async_deadlock.txt
>
>
> Hi,
> It looks like this was reported before in: LOG4J2-471
> We've encountered similar issue with one of the libraries where it's toString was indirectly
also logging. This caused a deadlock when RingBuffer was full. Please see attached stack snippet.
> According to the following docs, it's possible to set sync policy to synchronously log
the event if buffer is full. I don't see it documented. What's the policy option?
> https://issues.apache.org/jira/plugins/servlet/mobile#issue/LOG4J2-1080
> https://logging.apache.org/log4j/2.x/log4j-core/apidocs/org/apache/logging/log4j/core/async/AsyncQueueFullPolicyFactory.html
> Thank you



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

---------------------------------------------------------------------
To unsubscribe, e-mail: log4j-dev-unsubscribe@logging.apache.org
For additional commands, e-mail: log4j-dev-help@logging.apache.org


Mime
View raw message