使用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
相关产品推荐
相关产品推荐

