Skip to content

🌈 Java 日志彩色输出 + Logback 配置实战指南

✅ 什么是 ANSI 转义序列?

ANSI 转义序列(ANSI Escape Code)用于在终端中控制文本的样式,比如颜色、粗体、背景色等。以 \u001B[ 开头,后接控制码,以 m 结尾。

🖍 常用颜色控制码

前景色(文字颜色)

控制码颜色
30黑色
31红色
32绿色
33黄色
34蓝色
35洋红(紫)
36青色
37白色

背景色

控制码颜色
40黑色背景
41红色背景
42绿色背景
43黄色背景
44蓝色背景
45洋红背景
46青色背景
47白色背景

样式控制

控制码效果
1加粗
3斜体
4下划线
9删除线
7前景背景反转

📌 示例代码

java
// 黄色背景 + 黑色文字
LOGGER.info("\u001B[43;30m【配置初始化】Redis 配置加载完成\u001B[0m");

// 加粗绿色文字
LOGGER.info("\u001B[1;32m操作成功\u001B[0m");

// 红色背景 + 蓝色文字
LOGGER.info("\u001B[41;34m发生错误\u001B[0m");

🧠 高级用法

  • 亮色支持:前景色 90~97,背景色 100~107

  • 256 色支持

    • 前景:\u001B[38;5;<n>m
    • 背景:\u001B[48;5;<n>m
  • 真彩色(RGB)

    java
    \u001B[38;2;255;0;0m // 红色前景
    \u001B[48;2;0;0;255m // 蓝色背景

⚠ 注意事项

  • ✅ 适用于控制台/终端调试日志,提升可读性
  • ❌ 不推荐用于写入日志文件,会出现乱码
  • Windows 旧终端可能不支持 ANSI,需要用新版 Windows Terminal

✅ 总结

ANSI 转义序列让你用一行代码就能为日志加上颜色、样式和背景,是终端调试的视觉神器,但别用于生产日志文件中!

🔍 日志级别梳理

级别含义使用场景
ERROR致命错误,程序无法继续运行异常未捕获、数据库连接失败等
WARN警告信息,潜在问题参数异常但不影响流程、降级处理
INFO普通信息,关键业务流程请求开始/结束、任务调度、服务启动
DEBUG调试信息,用于开发排查变量值、条件判断、执行路径
TRACE最详细的日志,记录所有细节方法入口/出口、参数对象详情

🧾 Logback 日志格式解析

[%green(%-40.40logger{40})]

用于控制台打印日志类名部分的样式和格式,详解如下:

表达式含义
%logger日志记录器名称(类名)
{40}最多显示 40 字符,截断保留尾部
%-40.40logger{40}左对齐 + 保留尾部,推荐用法
%green(...)颜色包装,绿色显示,仅在控制台生效

✏️ 示例输出

log
[com.example.service.UserService      ] 用户登录成功
[com.example.task.JobExecutor        ] 任务执行失败

🧩 推荐 logback-spring.xml 配置片段

xml
<property name="LOG_PATTERN_DEV" value="[%d{HH:mm:ss.SSS}] [%highlight(%-5level)] [%blue(%-22.22X{traceId})] [%cyan(%-16.16thread)] [%green(%-40.40logger{40})] %msg%n"/>
<logger name="com.your.package" level="DEBUG"/>

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
        <pattern>${LOG_PATTERN_DEV}</pattern>
        <charset>UTF-8</charset>
    </encoder>
</appender>

✅ Java ANSI 日志工具类:AnsiColorUtils

java
public class AnsiColorUtils {

    private static final String PREFIX = "\u001B[";
    private static final String SUFFIX = "m";
    private static final String RESET = "\u001B[0m";

    public static final String BLACK = "30";
    public static final String RED = "31";
    public static final String GREEN = "32";
    public static final String YELLOW = "33";
    public static final String BLUE = "34";
    public static final String MAGENTA = "35";
    public static final String CYAN = "36";
    public static final String WHITE = "37";

    public static final String BG_BLACK = "40";
    public static final String BG_RED = "41";
    public static final String BG_GREEN = "42";
    public static final String BG_YELLOW = "43";
    public static final String BG_BLUE = "44";
    public static final String BG_MAGENTA = "45";
    public static final String BG_CYAN = "46";
    public static final String BG_WHITE = "47";

    public static final String BOLD = "1";
    public static final String UNDERLINE = "4";
    public static final String REVERSE = "7";

    public static String format(String text, String... styles) {
        String styleCode = String.join(";", styles);
        return PREFIX + styleCode + SUFFIX + text + RESET;
    }

    public static String success(String msg) {
        return format(msg, GREEN);
    }

    public static String error(String msg) {
        return format(msg, RED, BOLD);
    }

    public static String warning(String msg) {
        return format(msg, YELLOW);
    }

    public static String init(String msg) {
        return format(msg, BG_GREEN, BLACK);
    }

    public static String info(String msg) {
        return format(msg, BG_CYAN, BLACK);
    }

    public static String highlight(String msg) {
        return format(msg, BG_YELLOW, BLACK);
    }
}

✅ 示例使用

java
import lombok.extern.slf4j.Slf4j;

@Slf4j
public class TestAnsiLog {

    public static void main(String[] args) {
        log.info(AnsiColorUtils.init("【初始化】系统配置加载完成"));
        log.info(AnsiColorUtils.info("【信息】系统初始化完成"));
        log.warn(AnsiColorUtils.warning("【警告】配置文件缺失,使用默认配置"));
        log.error(AnsiColorUtils.error("【错误】数据库连接失败"));
        log.debug(AnsiColorUtils.success("【成功】连接已建立"));
        log.info(AnsiColorUtils.highlight("【高亮】Redis 配置加载完成"));
    }
}

🎨 效果预览

终端中将显示彩色日志,不同颜色快速分辨不同类型输出。

ANSI Color Log Example

所有文章版权皆归博主所有,仅供学习参考。