0%

logback异步输出日志

    目前所有的日志记录方式采用的都是同步的方式,即直接将日志写入文件。每次日志输出到文件都会进行一次磁盘IO,在多应用的时候这种效果会导致一定的线程运行延迟,所以可以采用异步的方式处理。

    采用异步写日志的方式,通过不让主线程去写日志文件而减少磁盘IO,避免并发下造成线程阻塞,从而减少不必要的性能损耗。

    异步输出日志的方式很简单,添加一个基于异步写日志的appender,并指向原先配置的appender即可:

操作步骤

step1、原先的appender

1
2
3
4
5
6
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>ts=%d{yyyy-MM-dd HH:mm:ss.SSS} app=${app_name} th=[%thread] lv=%-5level class=%logger{5} msg=%line-%msg%n</pattern>
<charset>utf-8</charset>
</encoder>
</appender>

step2、异步的appender

1
2
3
4
5
6
7
8
9
<!-- 日志信息异步输出配置 -->
<appender name="ASYNC-STDOUT" class="ch.qos.logback.classic.AsyncAppender">
<!--默认情况下,当blockingQueue的容量高于阈值时(80%),会丢弃ERROR以下级别的日志。如果不希望丢弃日志(既每次都全量保存),那可以设置为0-->
<discardingThreshold>0</discardingThreshold>
<!--默认情况下,队列的深度为256,不过该值首次建议设置大一些,后续根据自己业务的特点去调优。注意:该值会影响性能-->
<queueSize>512</queueSize>
<!--添加需要异步输出appender,只能添加一个,这里指向原先配置的appender即可-->
<appender-ref ref="STDOUT"/>
</appender>

step3、在springProfile多环境配置里,为root标签指定日志异步输出的appender对应的ref值

1
<springProfile name="qa">    <root level="${level}">        <!--日志信息同步输出-->        <appender-ref ref="STDOUT"/>        <!--日志信息异步输出-->        <!--<appender-ref ref="ASYNC-STDOUT"/>-->    </root></springProfile>

参考资料

Logback日志框架配置详解+异步输出_5忘初心的博客-CSDN博客_异步日志处理框架