You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用AsyncAppender时Logback的%method转换符输出问号,是否为已知问题

关于Logback AsyncAppender下%method显示问号的问题解答

没错,这其实是Logback AsyncAppender的默认行为,并不是什么未知bug哦。

问题原因

AsyncAppender的工作逻辑是把日志事件先放到队列里,交给后台线程异步处理输出。为了保证性能,它默认不会携带调用者的栈帧信息(包括方法名、行号这些)。当后台线程去格式化日志时,找不到原始调用处的方法信息,自然就只能用问号?来替代了。而普通的FileAppender是同步处理的,直接在当前调用线程获取栈信息,所以能正常显示方法名。

解决办法

只需要给你的AsyncAppender配置加上<includeCallerData>true</includeCallerData>,强制它收集调用者数据就行。修改后的完整配置示例大概是这样:

<appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
  <appender-ref ref="YOUR_FILE_APPENDER"/>
  <!-- 开启调用者数据收集,让%method能正常显示 -->
  <includeCallerData>true</includeCallerData>
</appender>

<appender name="YOUR_FILE_APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
  <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
    <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %logger{0}.%method: %msg %n</pattern>
  </encoder>
  <!-- 其他文件相关配置... -->
</appender>

注意事项

开启includeCallerData会带来一定的性能损耗,因为收集调用者栈信息需要遍历当前线程的栈帧。如果你的系统对日志性能要求极高,可能需要在功能和性能之间做个权衡。

内容的提问来源于stack exchange,提问作者Wojtek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 06:22:45