概述

为日志添加颜色可以使阅读变得更加轻松。

本文将介绍如何在Visual Studio Code终端、Linux和Windows命令提示符等控制台中为日志添加颜色。首先,我们需要注意的是,不幸的是,Eclipse IDE控制台的色彩设置有限。Eclipse IDE内部的控制台不支持由Java代码确定的颜色,因此本文介绍的解决方案在Eclipse IDE控制台中将无法工作。

2. 使用ANSI代码为日志着色

实现彩色日志最简单的方法是使用ANSI转义序列通常称为ANSI代码。

ANSI代码是一些终端解释为命令的特殊字节序列。

让我们用一个ANSI代码来输出:

System.out.println("Here's some text");
System.out.println("\u001B[31m" + "and now the text is red");

在输出中,我们可以看到ANSI代码未被打印出来,字体颜色已变为红色:

这是些文本 现在文本变成红色

请注意,我们需要确保在完成日志记录后重置字体颜色。

幸运的是,这很简单。我们只需打印\u001B\[31m,它是ANSI重置命令。

重置命令将控制台恢复到默认颜色。请注意,这不一定总是黑色,可能是白色或其他由控制台配置的任何颜色。例如:

System.out.println("Here's some text");
System.out.println("\u001B[31m" + "and now the text is red" + "\u001B[0m");
System.out.println("and now back to the default");

输出如下:

这是些文本 现在文本变成红色 现在回到默认

大多数日志库都会遵循ANSI代码,这使我们能够构建一些彩色的日志器。

例如,我们可以快速构造一个使用不同颜色的日志级别。

public class ColorLogger {
    
    private static final Logger LOGGER = LoggerFactory.getLogger(ColorLogger.class);
    
    public void logDebug(String logging) {
        LOGGER.debug("\u001B[34m" + logging + "\u001B[0m");
    }
    public void logInfo(String logging) {
        LOGGER.info("\u001B[32m" + logging + "\u001B[0m");
    }
    
    public void logError(String logging) {
        LOGGER.error("\u001B[31m" + logging + "\u001B[0m");
    }
}

让我们用这个来向控制台输出颜色:

ColorLogger colorLogger = new ColorLogger();
colorLogger.logDebug("Some debug logging");
colorLogger.logInfo("Some info logging");
colorLogger.logError("Some error logging");

[main] DEBUG com.baeldung.color.ColorLogger - 一些调试日志 [main] INFO com.baeldung.color.ColorLogger - 一些信息日志 [main] ERROR com.baeldung.color.ColorLogger - 一些错误日志

我们可以看到每个日志级别都有不同的颜色,使我们的日志更易于阅读。

最后,ANSI代码不仅可以控制字体颜色,还可以控制背景颜色、字体粗细和样式。示例项目中包含这些ANSI代码的一些选项。

3. 如何在Windows命令提示符中为日志着色

不幸的是,有些终端不支持ANSI代码。一个典型的例子是Windows命令提示符,上述方法将无法工作。因此,我们需要一个更复杂的方法。

然而,我们不必自己实现,而是可以利用名为JANSI的成熟库,在pom.xml中添加它:

<dependency>
    <groupId>org.fusesource.jansi</groupId>
    <artifactId>jansi</artifactId>
    <version>2.4.0</version>
</dependency>

现在,要为彩色日志调用JANSI提供的API:

private static void logColorUsingJANSI() {
    AnsiConsole.systemInstall();

    System.out.println(ansi()
        .fgRed()
        .a("Some red text")
        .fgBlue()
        .a(" and some blue text")
        .reset());

    AnsiConsole.systemUninstall();
}

这将产生文本:

一些红色文本和一些蓝色文本

请注意,我们必须先安装AnsiConsole,完成后卸载它。

与ANSI代码一样,JANSI也提供了大量的日志格式选项。

JANSI通过检测正在使用的终端并调用所需的平台特定API来实现此功能。这意味着当JANSI检测到Windows命令提示符时,它会使用不工作的ANSI代码,而是调用使用Java Native Interface (JNI)方法的库。

此外,JANSI不仅仅适用于Windows命令提示符——它能覆盖大多数终端(尽管由于Eclipse IDE对彩色文本的有限设置,Eclipse IDE控制台不在其中)。

最后,JANSI还会在不需要时删除不必要的ANSI代码,帮助保持我们的日志整洁。

总的来说,JANSI为我们提供了一种强大且方便的方式来在大多数环境和终端上进行彩色日志记录。

4. 总结

在这篇文章中,我们学习了如何使用ANSI代码控制控制台字体颜色,并看到了如何使用颜色区分日志级别的一个示例。

最后,我们发现并非所有控制台都支持ANSI代码,并提到了一个名为JANSI的库,它提供了更高级别的支持。

如往常一样,示例项目可以在GitHub上找到。