Java:Logback中AsyncAppender的使用说明

本文详细介绍了Logback的AsyncAppender配置,包括队列容量设置、队列剩余容量行为、队列满时的阻塞处理、应用停止时的队列清理以及LoggerContext的停止方式。通过调整队列大小和阈值,可以优化日志打印效率,避免业务线程被阻塞,并在应用关闭时确保日志的完整处理。
摘要由CSDN通过智能技术生成

在打印日志时,为了提高当前线程的执行效率,一般会将需要打印的内容交由专门的日志线程进行打印,比如Logback中会使用AsyncAppender。

AsyncAppender配置说明

目录

1.队列容量配置

2.队列剩余容量的不同行为

3.队列满时会阻塞

4.应用停止时清理队列

5.LoggerContext停止方式


1.队列容量配置

Logback使用BlockingQueue存放业务线程的打印内容,AsyncAppender会从此队列中取内容。队列默认大小为256,可使用参数如下进行配置。

    <appender name="asyncAppLog" class="ch.qos.logback.classic.AsyncAppender">
        <discardingThreshold>0</discardingThreshold>
        <queueSize>500</queueSize>
        <appender-ref ref="appLog" />
    </appender>

2.队列剩余容量的不同行为

默认情况下,当队列剩余容量小于总容量的20%时,日志级别<=INFO的内容将不会打印,只会打印WARN、ERROR级别的内容。可以设置如下参数改变默认配置:

    <appender name="asyncAppLog" class="ch.qos.logback.classic.AsyncAppender">
        <discardingThreshold>0</discardingThreshold>
        <queueSize>500</queueSize>
        <appender-ref ref="appLog" />
    </appender>

 默认情况下,discardingThreshold 的值为:discardingThreshold = queueSize / 5

比如,queueSize=500,则discardingThreshold 的取值范围: 0 <= discardingThreshold <= 500。

discardingThreshold =0时,表示剩余容量在小于0%的时候,日志级别<=INFO的内容才不会打印;但剩余容量最少也只会等于0%,不会小于0%,所以在此情况下所有日志级别都会打印。

discardingThreshold =500时,表示剩余容量在小于100%的时候,日志级别<=INFO的内容不会打印;所以此情况下只会打印WARN、ERROR级别的内容。

3.队列满时会阻塞

当队列满了时,会阻塞业务线程,此时异步处理会变成同步等待;只有队列有可用容量时,业务线程才从阻塞状态恢复。

4.应用停止时清理队列

LoggerContext停止时,由于队列中还会有没有打印的日志内容,因此需要等待一段时间,等待队列处理完毕。配置参数如下:

<shutdownHook class="ch.qos.logback.core.hook.DelayingShutdownHook">
    <delay>1000</delay>
</shutdownHook>

单位是ms。如果队列较大,队列内容较多,可以将此值设置的较大。如果超过此时间队列中的日志还没有处理完毕,则队列中的日志将抛弃。

5.LoggerContext停止方式

1)使用代码实现

在应用停止做收尾处理的时候添加如下代码:

LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
loggerContext.stop();

2)在logback.xml中配置

此时会在JVM上注册一个Hook,当JVM停止时,会调用loggerContext.stop();

<shutdownHook  />

3)在web容器环境

1.1.10以上版本提供了LogbackServletContainerInitializer,它已在logback-classic.jar中如下路径进行了配置,web容器会自动加载。当web容器停止时,也会自动loggerContext.stop();

/META-INF/services/javax.servlet.ServletContainerInitializer

 参考文档

Chapter 3: Logback configuration
Chapter 4: Appenders

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: 这个错误是由于在logback.xml配置文件使用了没有定义的appender标签导致的。\[1\]具体来说,错误信息提到了一个appender的名称为\[FILE\],但是在配置文件并没有定义这个appender。同样的问题也出现在另一个错误信息,其提到了一个appender的名称为\[CONFIG_LOG_FILE\],但是之前已经定义了一个相同名称的appender。\[2\]解决这个问题的方法是检查logback.xml配置文件,确保所有的appender都被正确定义,并且没有重复定义。另外,还可以通过查看控制台报出的日志的蓝色URL来获取更多的信息,这个URL会指向具体的错误位置。\[3\] #### 引用[.reference_title] - *1* *3* [logback: java.lang.IllegalStateException: Logback configuration error detected:](https://blog.csdn.net/qq_39597203/article/details/84661289)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [java.lang.IllegalStateException: Logback configuration error detected解决方案](https://blog.csdn.net/wobenqingfeng/article/details/130214311)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值