将slf4j格式化为带颜色的日志消息类型

21

我在我的Java应用程序中使用slf4j进行日志记录。这包括大量的日志记录和日志监控。
有时当整个日志以黑色打印出来时,从日志中阅读和查找信息真的很困难。
为了使其更易读,是否可以用不同的颜色记录不同类型的消息?例如所有错误级别的消息都用红色或不同的字体大小记录,而所有信息级别的消息都用蓝色和不同的字体大小记录。

欢迎任何建议或帮助。 谢谢。


也许如果您提供您的IDE名称会有所帮助。您可以询问如何映射到标准错误而不是标准输出以获取错误消息。 - d0x
日志文件是一个纯文本文件。没有颜色的概念。但是,您可能会找到一些可以为您着色编码日志的工具... - GreyBeardedGeek
7个回答

5
由于没有格式化程序,无法更改slf4j日志记录的颜色。 SLF4J是您的应用程序与某些日志记录设施(例如Log4j或Logback)之间的中间件。
您可以按照此处所述更改Log4j输出中的颜色。 我建议使用jcabi-logMulticolorLayout

谢谢您的回答,但是您提供的所有建议都是为了在控制台中获得彩色输出。由于我需要从多个系统收集日志文件并分析它们,所以我需要这些日志文件有颜色。 - Panshul
日志文件要着色?嗯... :) - yegor256
@Panshul 要将多个日志文件合并成一个,请尝试使用 Otros Log Viewer https://github.com/otros-systems/otroslogviewer。我已经使用它将几个基于Java的Windows服务的日志合并了几年。 - buzz3791

5

请记住一点,SLF4J仅是一个日志门面。实际日志消息如何处理取决于它所使用的绑定。因此,你的问题是无效的。相反,你应该引用你想要使用的实现(LogBack?Log4J?等等)

其次,“着色”在大多数情况下都没有意义。例如,如果您正在引用纯文本日志文件,我们无法控制着色,因为它们全都是普通文本(除非您的编辑器针对日志消息格式内置了特殊的语法高亮功能)。如果您希望在控制台/终端中看到颜色,或者如果您将日志输出到允许包含颜色信息的文件格式中(例如HTML),则可能有意义。

考虑到这两个观点,这是我的建议。

LogBack在控制台输出中内置了对着色的支持http://logback.qos.ch/manual/layouts.html#coloring。如果你正在寻找一种方法在控制台输出中看到颜色,并且可以使用LogBack,则这正是你想要的。


谢谢您的回答,但我正在使用Log4j,并且需要从不同的系统收集日志文件并对其进行分析。因此,在控制台中获得彩色输出是没有用的。我需要在日志文件中使用颜色。但是感谢您的建议,我会尝试HTML输出。 - Panshul
1
如果你能够在纯文本文件中添加颜色,那么你可以期望这样做。然而,这是不可实现的。你可以编写自己的查看器来分析日志信息并对其进行格式化和显示。我敢打赌,如果你愿意这样做,使用HTML加上一些CSS可能是一个好方法。 - Adrian Shum

3
我想到了两种解决方案。它们不是颜色,而是替代方案:
  1. 在您的文件附加器配置中,您可以配置模式以包括日志级别(错误,警告等)。然后您可以使用grep命令过滤级别来筛选消息。

  2. 您可以配置两个文件附加器(用于两个单独的日志文件),具有不同的级别阈值。例如,一个将将所有高于调试级别(如info、warn、error)的日志记录到logs.txt中,而另一个则仅将错误日志记录到errors.txt中。

希望对您有所帮助。

1
除了使用有色的ConsoleAppender,您还可以给语句本身上色。请注意,这种方法存在限制,并且可能无法在所有系统上正常工作。它在内部项目中效果良好,尤其是当您想记录链中的重要任务完成或仅在调试错误时。
引用一个外部链接
System.out.println("\u001B[31m" + "the text is red" + "\u001B[0m");

\u001B[31m 是将输出颜色设置为红色的 ANSI 代码,而 \u001B[31m 则是 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");
    }
}

在你的情况下,你可以尝试将聚合日志的内容写出来,并通过查找与你相关的每个字符串来选择性地为每个语句着色。
或者,你也可以将其打印到 HTML 页面上,并在文本上有选择地使用 CSS 样式。

1

在logback.xml中添加下一个appender以对日志输出进行着色:

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <!-- encoders are assigned the type
             ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
        <encoder>
            <Pattern>%d %highlight(%-5level) [%thread] %cyan(%logger{15}): %msg%n</Pattern>
        </encoder>
</appender>

0
在Java中,您可以使用ANSI转义码为控制台输出添加颜色。这些代码提供了一种在终端中操作文本外观的方式,包括更改文本颜色。但是,请记住,并非所有的终端都支持ANSI转义码,所以请确保您正在使用的终端支持。
要打印带有颜色的日志,您可以创建一个辅助方法,将适当的ANSI转义码附加到日志消息中。以下是如何实现的简单示例:
@Slf4j
public class ColoredLogger {

    // ANSI escape codes for text colors
    private static final String ANSI_RESET = "\u001B[0m";
    private static final String ANSI_BLACK = "\u001B[30m";
    private static final String ANSI_RED = "\u001B[31m";
    private static final String ANSI_GREEN = "\u001B[32m";
    private static final String ANSI_YELLOW = "\u001B[33m";
    private static final String ANSI_BLUE = "\u001B[34m";
    private static final String ANSI_PURPLE = "\u001B[35m";
    private static final String ANSI_CYAN = "\u001B[36m";
    private static final String ANSI_WHITE = "\u001B[37m";

    // Log levels
    public enum LogLevel {
        INFO(ANSI_GREEN),
        WARNING(ANSI_YELLOW),
        ERROR(ANSI_RED);

        private final String colorCode;

        LogLevel(String colorCode) {
            this.colorCode = colorCode;
        }

        public String getColorCode() {
            return colorCode;
        }
    }

    public static void log(LogLevel level, String message) {
                log.info(level.getColorCode() + message + ANSI_RESET);

    }

    public static void main(String[] args) {
        log(LogLevel.INFO, "This is an info message.");
        log(LogLevel.WARNING, "This is a warning message.");
        log(LogLevel.ERROR, "This is an error message.");
    }
}

在这个例子中,我们有一个ColoredLogger类,其中包含一个内部的LogLevel枚举,表示不同的日志级别。log方法接受一个日志级别和一条消息作为输入,并将消息以相应的颜色打印到控制台。
请记住,彩色文本的外观取决于您使用的终端或控制台。某些集成开发环境可能不完全支持ANSI转义码,因此输出可能无法按预期显示颜色。但是,在支持的终端上运行代码时,您应该能够看到彩色的日志。 控制台输出示例

-2

我同时使用过滤器来控制日志级别和包名。这个例子来自于Spring Boot的application.properties文件。

   logging.level.root=warn
   logging.level.org.springframework=warn
   logging.level.org.hibernate=warn
   logging.level.org.starmonkey.brown=DEBUG

这样我只能看到我想要看到的信息


谢谢!它对我有用!我在寻找org.slf4j.Logger之前搜索了几个小时。结果发现它与Spring Boot设置有关,而不是slf4j日志记录器。再次感谢! - abguy
1
这与原问题无关! - MHM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接