Spring Boot容器应用Logback颜色编码在Grafana Loki失效问题
问题根源
你配置的logback日志格式中使用了%highlight、%cyan这类带ANSI颜色编码的修饰符,这类编码是为终端控制台渲染颜色设计的,当日志被采集到Fluentd、Loki这类非终端的日志存储系统时,默认不会解析这类转义字符,就会直接显示为乱码,也无法正常渲染颜色。
可选解决方案
方案1:移除日志格式中的颜色修饰符(最通用)
直接修改logback.xml的日志pattern,删除所有颜色相关的修饰符,修改后的配置参考:
<?xml version="1.0" encoding="UTF-8"?> <configuration> <property name="LOG_PATH" value="logs" /> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern> %d{dd-MM-yyyy HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg %n </pattern> </encoder> </appender> <root level="INFO"> <appender-ref ref="STDOUT" /> </root> </configuration>
修改后输出的日志不会携带ANSI转义字符,采集到Loki后自然不会出现乱码。
方案2:动态适配颜色输出场景
如果需要保留本地开发时的终端颜色显示,线上部署自动关闭颜色输出,可以通过配置开关实现:
在logback的ConsoleAppender中添加withJansi参数,通过环境变量动态控制开关:
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <!-- 本地开发时设置为true开启颜色,线上默认false关闭 --> <withJansi>${LOG_COLOR_ENABLE:false}</withJansi> <encoder> <pattern> %d{dd-MM-yyyy HH:mm:ss.SSS} [%thread] %highlight(%-5level) %cyan(%logger{36}) - %msg %n </pattern> </encoder> </appender>
本地启动应用时添加JVM参数-DLOG_COLOR_ENABLE=true即可保留颜色输出,容器部署时不需要额外配置,默认关闭颜色输出避免乱码。
方案3:Fluentd采集层过滤转义字符
如果不想修改应用配置,可以在Fluentd采集环节添加过滤规则,删除日志中的ANSI转义字符,参考配置:
<filter **> @type record_transformer enable_ruby true <record> message ${record["message"].gsub(/\e\[[0-9;]*m/, '')} </record> </filter>
配置后Fluentd转发到Loki的日志已经清除了所有颜色转义符,不会出现乱码。
方案4:Grafana侧开启ANSI解析(保留颜色显示)
如果不想修改任何采集、应用配置,同时希望在Grafana中正常显示日志颜色,可以在Grafana的日志面板中开启ANSI escape code parsing开关,开启后Grafana会自动解析日志中的ANSI转义符渲染颜色,不会显示乱码。
内容的提问来源于stack exchange,提问作者TheAkashKamble
相关产品推荐
相关产品推荐

