java.util.logging - 如何更改 logging.properties 中的 Util.Logging.Logger 打印颜色
问题描述
目前,我所有的 INFO、SEVERE 和 FINE 日志都用红色打印。我想将 INFO 和 FINE 日志更改为白色。
我发现很多文章通过创建一个新的 Fommater 来改变颜色。我想知道如何通过修改 logging.properties 来更改打印颜色?
我正在使用 Java 默认日志库Util.Logging.Logger
环境:
- Ecipse 2018-12 (4.10.0)
- 视窗 10
解决方案
问题是 Eclipse 总是以相同的颜色(在本例中为红色)显示 stderr 输出。它可以在设置中配置,但对于所有 stderr 流总是相同的。
我的解决方案是为控制台处理程序使用自定义格式化程序,并根据其级别在每条消息之前注入 ANSI 颜色代码。所以我做了那个,基于SimpleFormatter.java
JDK8中的原版。这是代码:
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 文件:
- 将上面的代码另存为
CustomFormatter.java
- 编译它
javac CustomFormatter.java
- 创建一个包含类文件的 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
文件,位于lib
JRE 的文件夹中。您的计算机中可能有多个,您应该编辑与 Eclipse 正在使用的 JRE 版本相对应的一个。您可以通过阅读 Eclipse 中的“控制台”选项卡下方的内容来了解正在使用哪一个:logging.properties
使用文本编辑器打开。就我而言,我将编辑C:\Program Files\Java\jre1.8.0_231\lib\logging.properties
.- 您应该更改
java.util.logging.ConsoleHandler.formatter
值(在我的情况下是第 44 行),使其等于CustomFormatter
,就像这样:java.util.logging.ConsoleHandler.formatter = CustomFormatter
。确保保存更改。
在 Eclipse 中添加
CustomFormatter.jar
为 JRE 系统库。- 去
Window --> Preferences --> Java --> Installed JREs
- 选择您正在使用的 JRE,单击
Edit
并Add External JARs...
- 转到您保存的文件夹
CustomFormatter.jar
并选择它。 - 确保它在系统库列表中,然后单击
Finish
和Apply and Close
而已。现在每个 Logger 级别应该有不同的颜色。青色表示信息,黄色表示警告,红色表示严重。您可以通过使用相应的 ANSI 颜色代码修改上面的代码来将其更改为您想要的任何颜色。它适用于 java 8 和 Eclipse 2019-12:
- 去
注意:Limit console output
如果正常的标准输出文本显示为蓝色、红色或黄色,请尝试禁用Window --> Preferences --> Run/Debug --> Console