首页 > 解决方案 > 如何更改 logging.properties 中的 Util.Logging.Logger 打印颜色

问题描述

目前,我所有的 INFO、SEVERE 和 FINE 日志都用红色打印。我想将 INFO 和 FINE 日志更改为白色。

我发现很多文章通过创建一个新的 Fommater 来改变颜色。我想知道如何通过修改 logging.properties 来更改打印颜色?

我正在使用 Java 默认日志库Util.Logging.Logger

环境:

标签: java.util.logging

解决方案


问题是 Eclipse 总是以相同的颜色(在本例中为红色)显示 stderr 输出。它可以在设置中配置,但对于所有 stderr 流总是相同的。

我的解决方案是为控制台处理程序使用自定义格式化程序,并根据其级别在每条消息之前注入 ANSI 颜色代码。所以我做了那个,基于SimpleFormatter.javaJDK8中的原版。这是代码:

import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.Date;
import java.util.logging.Formatter;
import java.util.logging.LogRecord;

public class CustomFormatter extends Formatter {

    public static final String ANSI_RESET = "\u001B[0m";
    public static final String ANSI_RED = "\u001B[31m";
    public static final String ANSI_YELLOW = "\u001B[33m";
    public static final String ANSI_CYAN = "\u001B[36m";

    private final Date dat = new Date();
    private static final String format = "%1$s %2$tb %2$td, %2$tY %2$tl:%2$tM:%2$tS %2$Tp %3$s%n%5$s: %6$s%7$s%n";

    @Override
    public String format(LogRecord record) {
        dat.setTime(record.getMillis());
        String source;
        if (record.getSourceClassName() != null) {
            source = record.getSourceClassName();
            if (record.getSourceMethodName() != null) {
                source += " " + record.getSourceMethodName();
            }
        } else {
            source = record.getLoggerName();
        }
        String message = formatMessage(record);
        String throwable = "";
        if (record.getThrown() != null) {
            StringWriter sw = new StringWriter();
            PrintWriter pw = new PrintWriter(sw);
            pw.println();
            record.getThrown().printStackTrace(pw);
            pw.close();
            throwable = sw.toString();
        }

        switch (record.getLevel().toString()) {
            case "INFO":
                return String.format(format, ANSI_CYAN, dat, source, record.getLoggerName(),
                        record.getLevel().getLocalizedName(), message + ANSI_RESET, throwable);
            case "WARNING":
                return String.format(format, ANSI_YELLOW, dat, source, record.getLoggerName(),
                        record.getLevel().getLocalizedName(), message + ANSI_RESET, throwable);
            case "SEVERE":
                return String.format(format, ANSI_RED, dat, source, record.getLoggerName(),
                        record.getLevel().getLocalizedName(), message + ANSI_RESET, throwable);
            default:
                return String.format(format, dat, source, record.getLoggerName(),
                        record.getLevel().getLocalizedName(), message, throwable);
        }
    }
}

先决条件

  • Eclipse控制台插件中的 ANSI Escape 。您将需要它,以便 Eclipse 控制台可以解释 ANSI Escape 代码。安装它并重新启动 Eclipse

  • 上面的代码编译并压缩成一个 .jar 文件

    1. 将上面的代码另存为CustomFormatter.java
    2. 编译它javac CustomFormatter.java
    3. 创建一个包含类文件的 JAR 文件,jar cfv CustomFormatter.jar CustomFormatter.class并将其保存在您想要的任何文件夹中(例如,在 中C:\java\CustomFormatter

指示

  • Window --> Preferences --> Ansi Console检查Try using the standard error color setting for stderr output,然后Apply and Close
  • 编辑logging.properties文件,位于libJRE 的文件夹中。您的计算机中可能有多个,您应该编辑与 Eclipse 正在使用的 JRE 版本相对应的一个。您可以通过阅读 Eclipse 中的“控制台”选项卡下方的内容来了解​​正在使用哪一个:JRE 文件夹

    1. logging.properties使用文本编辑器打开。就我而言,我将编辑C:\Program Files\Java\jre1.8.0_231\lib\logging.properties.
    2. 您应该更改java.util.logging.ConsoleHandler.formatter值(在我的情况下是第 44 行),使其等于CustomFormatter就像这样:java.util.logging.ConsoleHandler.formatter = CustomFormatter。确保保存更改。
  • 在 Eclipse 中添加CustomFormatter.jar为 JRE 系统库

    1. Window --> Preferences --> Java --> Installed JREs
    2. 选择您正在使用的 JRE,单击EditAdd External JARs...
    3. 转到您保存的文件夹CustomFormatter.jar并选择它。
    4. 确保它在系统库列表中,然后单击FinishApply and Close
    5. 而已。现在每个 Logger 级别应该有不同的颜色。青色表示信息,黄色表示警告,红色表示严重。您可以通过使用相应的 ANSI 颜色代码修改上面的代码来将其更改为您想要的任何颜色。它适用于 java 8 和 Eclipse 2019-12:

      结果

注意:Limit console output如果正常的标准输出文本显示为蓝色、红色或黄色,请尝试禁用Window --> Preferences --> Run/Debug --> Console


推荐阅读