如何在Logback JSON控制台Appender的message字段追加时间戳与日志名
问题描述
当前使用的Logback控制台Appender配置如下:
<appender name="CONSOLE_JSON" class="ch.qos.logback.core.ConsoleAppender"> <encoder class="net.logstash.logback.encoder.LogstashEncoder"> <customFields>{ "name": "${foobar.foo}", "id": "${foobar.foo.Id}" }</customFields> </encoder> </appender>
该配置生成的日志格式为:
{"@timestamp":"2025-04-21T20:28:10.501365652Z","@version":"1","message":"This is process log.","logger_name":"com.foo.bar.common.Logger","thread_name":"dev","level":"INFO","level_value":20000,"name":"foobar","Id":"1"}
需要将时间戳和日志名追加到message字段,使message格式变为:
"message":"2025-04-21T20:28:10.5013 [com.foo.bar.common.Logger] This is process log."
此前尝试使用LoggingEventCompositeJsonEncoder未成功,求可行实现方案。
解决方案
方案一:直接修改LogstashEncoder配置(推荐)
利用LogstashEncoder自带的messagePattern属性,无需更换编码器即可定制message字段格式,配置如下:
<appender name="CONSOLE_JSON" class="ch.qos.logback.core.ConsoleAppender"> <encoder class="net.logstash.logback.encoder.LogstashEncoder"> <!-- 自定义message字段的组合格式 --> <messagePattern>%d{yyyy-MM-dd'T'HH:mm:ss.SSS} [%logger] %msg</messagePattern> <customFields>{ "name": "${foobar.foo}", "id": "${foobar.foo.Id}" }</customFields> </encoder> </appender>
配置说明
%d{yyyy-MM-dd'T'HH:mm:ss.SSS}:生成指定格式的时间戳,匹配需求中的毫秒精度[%logger]:将日志记录器的全限定名包裹在方括号中输出%msg:输出原始的日志消息内容
此方案会自动保留@timestamp、logger_name等默认字段,同时修改message字段为目标格式,配置简洁易维护。
方案二:正确使用LoggingEventCompositeJsonEncoder
如果坚持使用LoggingEventCompositeJsonEncoder,需显式声明所有需要输出的字段,避免默认字段丢失,配置如下:
<appender name="CONSOLE_JSON" class="ch.qos.logback.core.ConsoleAppender"> <encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder"> <providers> <!-- 保留默认时间戳字段 --> <timestamp/> <!-- 自定义message字段的内容 --> <pattern> <pattern> { "message": "%d{yyyy-MM-dd'T'HH:mm:ss.SSS} [%logger] %msg" } </pattern> </pattern> <!-- 输出其他必要的默认字段 --> <level/> <threadName/> <loggerName/> <!-- 添加自定义字段 --> <customFields>{ "name": "${foobar.foo}", "id": "${foobar.foo.Id}" }</customFields> </providers> </encoder> </appender>
注意事项
LoggingEventCompositeJsonEncoder不会自动输出默认字段,需通过<providers>下的标签逐一声明<pattern>标签用于构造自定义JSON字段,这里直接定义message的格式
内容的提问来源于stack exchange,提问作者Fetona
相关产品推荐
相关产品推荐

