2016-09-25 81 views
2

每当日志文件轮换时,应用程序线程都会卡住,这会导致API的延迟时间太长我正在使用Async Appender,不知道为什么在循环中应用程序线程是等候。Dropwizard logback异步日志循环导致应用程序线程等待

logback.xml

<configuration debug="true"> 
<property name="async.discardingThreshold" value="0"/> 
<property name="async.queueSize" value="500"/> 
<property name="log.dir" value="/var/log"/> 
<property name="log.pattern" value="%highlight(%-5level) [%date] [%thread] [%X{id}] [%cyan(%logger{0})]: %message%n"/> 
<property name="errorLog.pattern" value="%highlight(%-5level) [%date] [%thread] [%X{id}] [%red(%logger{0})]: %message%n"/> 
<property name="log.maxHistory" value="200"/> 
<property name="log.default.maxFileSize" value="100MB"/> 
<property name="log.error.maxFileSize" value="10MB"/> 


<appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender"> 
    <File>${log.dir}/default.log</File> 
    <Append>true</Append> 
    <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"> 
     <fileNamePattern>${log.dir}/default.%i.log.gz</fileNamePattern> 
     <maxIndex>${log.maxHistory}</maxIndex> 
    </rollingPolicy> 
    <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> 
     <maxFileSize>${log.default.maxFileSize}</maxFileSize> 
    </triggeringPolicy> 
    <encoder> 
     <pattern>%replace(${log.pattern}){'"pin":"\d+"','"pin":"XXXX"'}%n</pattern> 
    </encoder> 
</appender> 

<appender name="ASYNC-INFO" class="ch.qos.logback.classic.AsyncAppender"> 
    <discardingThreshold>${async.discardingThreshold}</discardingThreshold> 
    <queueSize>${async.queueSize}</queueSize> 
    <filter class="ch.qos.logback.core.filter.EvaluatorFilter"> 
     <OnMismatch>DENY</OnMismatch> 
     <OnMatch>NEUTRAL</OnMatch> 
    </filter> 
    <appender-ref ref="INFO"/> 
</appender> 

<appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender"> 
    <file>${log.dir}/error.log</file> 
    <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"> 
     <fileNamePattern>${log.dir}/error.%i.log.gz</fileNamePattern> 
     <maxIndex>${log.maxHistory}</maxIndex> 
    </rollingPolicy> 
    <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> 
     <maxFileSize>${log.error.maxFileSize}</maxFileSize> 
    </triggeringPolicy> 
    <encoder> 
     <pattern>%replace(${errorLog.pattern}){'"pin":"\d+"','"pin":"XXXX"'}%n</pattern> 
    </encoder> 
</appender> 

<appender name="ASYNC-ERROR" class="ch.qos.logback.classic.AsyncAppender"> 
    <discardingThreshold>${async.discardingThreshold}</discardingThreshold> 
    <queueSize>${async.queueSize}</queueSize> 
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> 
     <level>ERROR</level> 
    </filter> 

    <appender-ref ref="ERROR"/> 
</appender> 


<root level="INFO"> 
    <appender-ref ref="ASYNC-ERROR"/> 
    <appender-ref ref="ASYNC-INFO"/> 
</root> 

回答

2

在我们logback.xml我们已经指定,

<property name="async.discardingThreshold" value="0"/> 

现在快速浏览一下源代码暗示什么可能可能发生的是导致旋转时的延迟

@Override 
    protected void append(E eventObject) { 
    if (isQueueBelowDiscardingThreshold() && isDiscardable(eventObject)) { 
     return; 
    } 
    preprocess(eventObject); 
    put(eventObject); 
    } 
    private boolean isQueueBelowDiscardingThreshold() { 
    return (blockingQueue.remainingCapacity() < discardingThreshold); 
    } 

blockingQueue.remainingCapacity()< discardingThreshold,如果丢弃阈值为0,则此条件将永远不会计算为true,这意味着async-appender线程将尝试推送到已经完整的阻塞队列,因此将停放自身和等待它,导致应用程序线程也等待。 将此值设置为大于0的任何值都不会导致超时,但是,某些事件可能会丢失。 保持所有事件没有任何丢弃的另一种选择是增加队列大小,以便在文件轮换的瞬间,不超过队列中队列元素的大小。在这种情况下,async-appender线程不会等待阻塞队列。

所以我的结论是的logback AsyncAppender是不是那么异步如果消息传入速率超过了队列的消耗率和丢弃率为0