格式化 slf4j 以使用颜色记录消息类型

问题描述 投票:0回答:7

我正在使用 slf4j 登录我的 Java 应用程序。它涉及大量的日志记录和日志监控。
有时,当整个日志都以黑色打印时,从日志中读取和查找信息确实很困难。
为了使其更具可读性,是否可以用不同的颜色记录不同类型的消息?
例如,所有错误级别消息均采用红色或不同的字体大小,所有信息级别消息均采用蓝色和不同的字体大小。

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

java logging slf4j
7个回答
5
投票

无法更改

slf4j
日志记录的颜色,因为没有格式化程序。 SLF4J 是您的应用程序和某些日志记录工具(例如 Log4j 或 Logback)之间的中间件。

您可以更改 Log4j 输出中的颜色,如此处所述。我建议使用 jcabi-log 中的 MulticolorLayout


5
投票

有件事你必须牢记。

首先,SLF4J 只是一个日志门面。实际日志消息的处理方式取决于它使用的绑定。因此你的问题是无效的,相反,你应该引用你想要使用的实现(LogBack?Log4J?等)

其次,“着色”在大多数情况下并没有什么意义。例如,如果您引用纯文本日志文件,我们无法控制颜色,因为它们都是纯文本(除非您的编辑器针对您的日志消息格式内置了特殊的语法突出显示)。如果您想在控制台/终端中查看颜色,或者如果您将日志输出为允许包含颜色信息的文件格式(例如 HTML),这可能会很有意义。

考虑到这两个想法,这是我的建议。

LogBack 内置支持控制台输出中的着色 http://logback.qos.ch/manual/layouts.html#coloring。如果您正在寻找在控制台输出中查看颜色的方法,并且您可以使用 LogBack,那么这就是您正在寻找的。


3
投票

我想到了两种解决方案。它们不是颜色,而是替代解决方案:

  1. 在文件追加器配置中,您可以配置模式以包含日志级别(错误、警告等)。然后你可以 grep 文件,按级别过滤消息。

  2. 您可以配置两个具有不同级别阈值的文件附加程序(用于两个单独的日志文件)。例如,一个会将调试级别以上的所有日志(例如信息、警告、错误)记录到logs.txt中,另一个将仅将错误日志记录到errors.txt

希望有帮助。


1
投票

将下一个附加程序添加到 logback.xml 中以对日志输出进行着色:

<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>

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 来完成。


0
投票

在 Java 中,您可以使用 ANSI 转义码向控制台输出添加颜色。这些代码提供了一种操作终端中文本外观的方法,包括更改文本颜色。但是,请记住,并非所有终端都支持 ANSI 转义码,因此请确保您使用的终端支持。

要打印彩色日志,您可以创建一个辅助方法,将适当的 ANSI 转义码附加到日志消息中。以下是如何执行此操作的简单示例:

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) {
        System.out.println(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 方法将日志级别和消息作为输入,并将消息以相应的颜色打印到控制台。

请记住,彩色文本的外观取决于您使用的终端或控制台。某些 IDE 可能不完全支持 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

这样我就只能看到我想看的消息

© www.soinside.com 2019 - 2024. All rights reserved.