目前,我所有的 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 文件中:
- 将上面的代码保存为
CustomFormatter.java
- 使用
javac CustomFormatter.java
编译它 - 使用
jar cfv CustomFormatter.jar CustomFormatter.class
创建一个包含类文件的 JAR 文件,并将其保存在您想要的任何文件夹中(例如,在C:\java\CustomFormatter
)
- 将上面的代码保存为
说明
- 转到
窗口 --> 首选项 --> Ansi Console
并选中尝试使用 stderr 输出的标准错误颜色设置
,然后应用并关闭
。 编辑
logging.properties
文件,该文件位于 JRE 的lib
文件夹中。您的计算机中可能有多个,您应该编辑与 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 系统库。- 转到
窗口 --> 首选项 --> Java --> 安装的 JRE
- 选择您正在使用的 JRE,点击
编辑
和添加外部 JAR...
- 转到保存
CustomFormatter.jar
的文件夹并选择它。 - 确保它位于系统库列表中,然后点击
完成
和应用并关闭
就是这样。现在每个记录器级别应该有不同的颜色。青色表示“信息”,黄色表示“警告”,红色表示“严重”。您可以通过使用corresponding ANSI Color code修改上面的代码将其更改为您想要的任何颜色。 。它适用于 java 8 和 Eclipse 2019-12:
- 转到
注意:如果正常的标准输出文本显示为蓝色、红色或黄色,请尝试在窗口 --> 首选项 --> 运行/调试中禁用
限制控制台输出
--> 控制台
关于java.util.logging - 如何更改logging.properties中的Util.Logging.Logger打印颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54909752/