讲师中心 微信公众号
AI工具推荐 视频效率加速

如何用Logback的XML配置实现异步日志

秋磊小哥_4845

秋磊小哥_4845

发布时间:2025-12-18 13:24:42

|

900人浏览过

|

来源于php中文网

原创

Logback通过AsyncAppender包装同步Appender实现异步日志,其核心是将日志事件提交至后台队列由独立线程消费;需先定义同步Appender(如RollingFileAppender),再用AsyncAppender引用,并绑定到root或指定logger。

如何用logback的xml配置实现异步日志

Logback 本身不直接提供异步日志的 <appender></appender> 标签,而是通过 AsyncAppender 包装同步 Appender 来实现异步写入。核心思路是:把日志事件提交给一个后台线程队列,由独立线程消费并委托给目标 Appender(如 FileAppender、ConsoleAppender)处理。

配置 AsyncAppender 包裹目标 Appender

AsyncAppender 是一个“装饰器”型 Appender,它不负责实际输出,只负责异步调度。你需要先定义一个同步 Appender(比如输出到文件),再用 AsyncAppender 引用它:

<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
  <file>logs/app.log</file>
  <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
    <fileNamePattern>logs/app.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
    <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
      <maxFileSize>10MB</maxFileSize>
    </timeBasedFileNamingAndTriggeringPolicy>
  </rollingPolicy>
  <encoder>
    <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
  </encoder>
</appender>
<p><!-- 异步包装 -->
<appender name="ASYNC_FILE" class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="FILE"/>
<!-- 可选:队列大小,默认256 -->
<queueSize>1024</queueSize>
<!-- 可选:丢弃超过队列容量的日志?默认true -->
<discardingThreshold>0</discardingThreshold>
<!-- 可选:是否包含调用者信息(如行号),异步下默认false以提升性能 -->
<includeCallerData>false</includeCallerData>
</appender>

将 AsyncAppender 绑定到 Logger 或 root

配置好 AsyncAppender 后,需将其关联到 logger,才能生效:

Yyds.Auto
Yyds.Auto

通过MCP控制Android设备——点击、滑动、OCR、截图、UI自动化、Shell、文件管理及AI代理编排,实现Android RPA。

下载
  • 绑定到 root logger(全局生效):
<root level="INFO">
  <appender-ref ref="ASYNC_FILE"/>
</root>
  • 或指定某个包/类使用异步日志:
<logger name="com.example.service" level="DEBUG" additivity="false">
  <appender-ref ref="ASYNC_FILE"/>
</logger>

关键参数说明与调优建议

AsyncAppender 的行为受几个关键参数影响,合理设置可避免丢日志或内存溢出:

  • queueSize:阻塞队列容量。默认 256,建议根据吞吐量设为 512–4096;过小易丢日志,过大占内存
  • discardingThreshold:当队列剩余容量 ≤ 该值时,新日志会被丢弃(非 ERROR 级别)。设为 0 表示队满即丢;设为 queueSize 则永不丢(但可能阻塞)
  • includeCallerData:若需 %class、%method、%line 等信息,需设为 true,但会显著降低性能(需遍历栈帧),异步场景通常关闭
  • neverBlock:设为 true 时,队列满则直接丢日志(不等待);默认 false(会阻塞生产者线程直到有空位)

注意事项与常见问题

AsyncAppender 虽提升性能,但引入了新约束:

  • 日志输出不保证实时可见:异步线程可能延迟写入,程序崩溃时队列中日志会丢失
  • 异常堆栈在异步模式下可能不完整:除非开启 includeCallerData 且日志级别含 ERROR,否则不会自动补全
  • 不要对 AsyncAppender 嵌套使用:即不能让一个 AsyncAppender 引用另一个 AsyncAppender
  • 如果同时需要控制台和文件异步输出,应分别定义两个 AsyncAppender,各自包装 ConsoleAppender 和 RollingFileAppender

热门AI工具

更多
火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

花生AI
花生AI Hot

一款AI视频创作工具,主要用于B站推出的AI视频创作工具,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

码上飞
码上飞 Hot

一款基于自然语言的AI应用开发平台,可根据用户描述自动生成应用程序,帮助个人和团队快速完成应用原型与开发。

相关专题

更多
pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

5024

2024.04.01

xml怎么变成word
xml怎么变成word

步骤:1. 导入 xml 文件;2. 选择 xml 结构;3. 映射 xml 元素到 word 元素;4. 生成 word 文档。提示:确保 xml 文件结构良好,并预览 word 文档以验证转换是否成功。想了解更多xml的相关内容,可以阅读本专题下面的文章。

6517

2024.08.01

xml是什么格式的文件
xml是什么格式的文件

xml是一种纯文本格式的文件。xml指的是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。想了解更多相关的内容,可阅读本专题下面的相关文章。

2602

2024.11.28

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1049

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3380

2023.10.25

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

6747

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2788

2023.08.10

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

6747

2023.07.18

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

0

2026.11.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
uni-app从入门到实战教程
uni-app从入门到实战教程

共0课时 | 0人学习

uni-app x harmony开发指南
uni-app x harmony开发指南

共0课时 | 0人学习

uni-app鸿蒙运行和发行
uni-app鸿蒙运行和发行

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn