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

如何在Spring Boot中通过Logback为不同包日志设置差异化颜色?

优化Logback按包区分日志颜色的配置(消除冗余)

你当前的实现通过为每个包创建独立ConsoleAppender来区分颜色,虽然能实现需求,但包数量增加时会产生大量重复配置,维护成本高。以下是两种更高效的优化方案:

方案一:自定义TurboFilter + MDC(适合多包场景)

通过自定义TurboFilter根据日志所属包名设置MDC变量,再在统一的appender中引用该变量实现颜色区分,仅需一个ConsoleAppender。

第一步:Logback配置文件

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!-- 自定义TurboFilter,根据包名映射日志颜色 -->
    <turboFilter class="com.rudra.logging.PackageColorTurboFilter">
        <packageColorMap>
            <entry key="com.rudra.logging.teacher" value="yellow"/>
            <entry key="com.rudra.logging.user" value="cyan"/>
            <!-- 新增包时直接添加entry即可 -->
        </packageColorMap>
    </turboFilter>

    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} %magenta([%thread]) %logger{36} - %${LOG_COLOR:-%msg%n}</pattern>
        </encoder>
    </appender>

    <root level="INFO">
        <appender-ref ref="console"/>
    </root>

    <!-- 仅需单独配置日志级别,无需重复绑定appender -->
    <logger name="com.rudra.logging.teacher" level="WARN"/>
    <logger name="com.rudra.logging.user" level="WARN"/>
</configuration>

第二步:实现自定义TurboFilter

package com.rudra.logging;

import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.turbo.TurboFilter;
import ch.qos.logback.core.spi.FilterReply;
import org.slf4j.MDC;
import org.slf4j.Marker;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

public class PackageColorTurboFilter extends TurboFilter {
    private Map<String, String> packageColorMap = new ConcurrentHashMap<>();

    @Override
    public FilterReply decide(Marker marker, Logger logger, Level level, String format, Object[] params, Throwable t) {
        String loggerName = logger.getName();
        String matchedColor = null;
        int longestMatchLength = 0;

        // 匹配最长的包前缀,支持子包继承颜色
        for (Map.Entry<String, String> entry : packageColorMap.entrySet()) {
            String pkg = entry.getKey();
            if (loggerName.startsWith(pkg) && pkg.length() > longestMatchLength) {
                longestMatchLength = pkg.length();
                matchedColor = entry.getValue();
            }
        }

        if (matchedColor != null) {
            MDC.put("LOG_COLOR", "%" + matchedColor + "(%msg%n)");
        } else {
            MDC.remove("LOG_COLOR");
        }
        return FilterReply.NEUTRAL;
    }

    public void setPackageColorMap(Map<String, String> packageColorMap) {
        this.packageColorMap = packageColorMap;
    }
}

方案优势

  • 仅需一个ConsoleAppender,彻底消除配置冗余
  • 新增包仅需在packageColorMap中添加一行配置,无需复制粘贴大量代码
  • 支持子包自动继承父包的颜色配置,灵活性更高

方案二:使用Logback内置条件判断(适合少包场景)

无需编写Java代码,直接在日志pattern中通过%if/%elseif表达式判断包名,实现颜色区分。

Logback配置文件

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>
%d{HH:mm:ss.SSS} %magenta([%thread]) %logger{36} - 
%if(%logger startsWith "com.rudra.logging.teacher"){%yellow(%msg%n)}
%elseif(%logger startsWith "com.rudra.logging.user"){%cyan(%msg%n)}
%else{%msg%n}
            </pattern>
        </encoder>
    </appender>

    <root level="INFO">
        <appender-ref ref="console"/>
    </root>

    <logger name="com.rudra.logging.teacher" level="WARN"/>
    <logger name="com.rudra.logging.user" level="WARN"/>
</configuration>

方案优势

  • 零Java代码,纯配置实现,快速上手
  • 配置逻辑直观,适合包数量较少的场景

对比原方案

原方案每个包对应一个独立ConsoleAppender,重复了大量encoder和pattern配置,新增包时需复制整个appender块,维护成本随包数量增长而线性上升。上述两种方案均只保留一个ConsoleAppender,新增包的配置成本极低,大幅提升可维护性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 18:14:55