java.util.logging - 如何更改logging.properties中的Util.Logging.Logger打印颜色

标签 java.util.logging

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

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

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

环境:

  • Ecipse 2018-12 (4.10.0)
  • Windows 10

最佳答案

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

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

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);
        }
    }
}

先决条件

  • ANSI Escape in Console plugin对于 Eclipse。您将需要它,以便 Eclipse 控制台可以解释 ANSI 转义代码。 安装它并重新启动 Eclipse

  • 上面的代码编译并压缩到.jar 文件中:

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

说明

  • 转到窗口 --> 首选项 --> Ansi Console 并选中尝试使用 stderr 输出的标准错误颜色设置,然后应用并关闭
  • 编辑 logging.properties 文件,该文件位于 JRE 的 lib 文件夹中。您的计算机中可能有多个,您应该编辑与 Eclipse 使用的 JRE 版本相对应的一个。您可以通过阅读 Eclipse 中“控制台”选项卡下面的内容来了解​​正在使用哪一个:JRE folder

    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. 转到窗口 --> 首选项 --> Java --> 安装的 JRE
    2. 选择您正在使用的 JRE,点击编辑添加外部 JAR...
    3. 转到保存 CustomFormatter.jar 的文件夹并选择它。
    4. 确保它位于系统库列表中,然后点击完成应用并关闭
    5. 就是这样。现在每个记录器级别应该有不同的颜色。青色表示“信息”,黄色表示“警告”,红色表示“严重”。您可以通过使用corresponding ANSI Color code修改上面的代码将其更改为您想要的任何颜色。 。它适用于 java 8 和 Eclipse 2019-12:

      Result

注意:如果正常的标准输出文本显示为蓝色、红色或黄色,请尝试在窗口 --> 首选项 --> 运行/调试中禁用限制控制台输出 --> 控制台

关于java.util.logging - 如何更改logging.properties中的Util.Logging.Logger打印颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54909752/

相关文章:

java - JUL 配置类应该如何(以及为什么)初始化?

java - 在java logger的配置文件中指定自己的Formatter

java - 将 logback-access 与 Google App Engine (GAE) 结合使用

java - java.util.logging.Logger 在哪里存储他们的日志

java.util.logging.FileHandler 和多线程

java - 如何使用 JDK Logging 手动滚动日志文件

java - 从 SOAP Logger 禁用不需要的 INFO 消息

java - 如何输出当前java.util.logging.Logger日志文件名?

java - 如何将 java.util.logging 重定向到文件?