如何在 logging.properties 中更改 Util.Logging.Logger 打印颜色
How to change the Util.Logging.Logger printing colour in logging.properties
目前,我所有的 INFO、SEVERE 和 FINE 日志都是用红色打印的。我想将 INFO 和 FINE 日志更改为白色。
我发现很多文章都是通过创建一个新的 Fommater 来改变颜色的。我想知道如何通过修改 logging.properties?
来更改打印颜色
我正在使用 Java 默认日志记录库 Util.Logging.Logger
环境:
- Ecipse 2018-12 (4.10.0)
- Windows 10
Currently, all my INFO, SEVERE and FINE logs are printed with red colour.
这取决于哪个进程正在消耗 System.err
。 。您正在使用哪个 IDE?也许它具有修改控制台输出呈现方式的设置。对于日食,您可以:
- 更改 Standard Out/Standard Error text color,使标准输出为白色,标准错误为红色。
- 创建一个设置为警告级别的常规 ConsoleHandler。这会将所有警告及以上内容定向到红色的 ERR 流。
- 创建一个特殊的Handler to print to Standard OUT并将级别设置为ALL。
- 创建一个 java.util.logging.Filter 来过滤掉标准 OUT 处理程序的大于 INFO 的消息,并将其安装在该处理程序上。
- 将控制台处理程序 (ERR) 和 OUT 处理程序附加到根记录器。
I am wondering how could I change the printing colour by modifying the logging.properties?
您在 logging.properties 中唯一可以做的就是安装一种新型的 Formatter 或第三方处理程序,它们可能能够更改输出颜色,但是,这取决于消耗的控制台输出流的方式呈现(例如 HTML 与 BASH 终端)。
问题是 Eclipse 总是以相同的颜色(在本例中为红色)显示 stderr 输出。它在设置中是可配置的,但对于所有 stderr 流它总是相同的。
我的解决方案是为控制台处理程序使用自定义格式化程序,并根据消息的级别在每条消息之前注入 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 Escape 代码。 安装并重启Eclipse.
上面的代码编译并压缩成一个.jar文件:
- 将上面的代码保存为
CustomFormatter.java
- 用
javac CustomFormatter.java
编译
- 使用
jar cfv CustomFormatter.jar CustomFormatter.class
创建一个包含 Class 文件的 JAR 文件,并将其保存在您想要的任何文件夹中(例如,在 C:\java\CustomFormatter
中)
说明
- 转到
Window --> Preferences --> Ansi Console
并检查 Try using the standard error color setting for stderr output
,然后 Apply and Close
。
编辑 logging.properties
文件,该文件位于 JRE 的 lib
文件夹中。您的计算机中可能有多个,您应该编辑与 Eclipse 使用的 JRE 版本相对应的那个。您可以通过阅读 Eclipse 中 "Console" 选项卡下方的内容来了解正在使用哪个:
- 使用文本编辑器打开
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
- Select 您正在使用的 JRE,单击
Edit
和 Add External JARs...
- 转到您保存
CustomFormatter.jar
和 select 的文件夹。
- 确保它在系统库列表中,然后单击
Finish
和 Apply and Close
就是这样。您现在应该为每个 Logger 级别设置不同的颜色。 INFO 为青色,WARNING 为黄色,SEVERE 为红色。您可以通过使用 corresponding ANSI Color code 修改上面的代码来将其更改为您想要的任何颜色。它适用于 java 8 和 Eclipse 2019-12:
注意: 如果正常的标准输出文本显示为蓝色、红色或黄色,请尝试在 Window --> Preferences --> Run/Debug --> Console
中禁用 Limit console output
jajube 的回答很棒。我使用 netbeans 8.2。它的控制台有默认的红色文本,但处理 ANSI 代码。我修改了他对下面格式化程序的回答
package net.sf.jaer.util;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.Date;
import java.util.logging.Formatter;
import java.util.logging.LogRecord;
/**
* Based on
*
* with ANSI codes from
*
*
* @author tobid Jan 2021
*/
public class LoggingAnsiColorConsoleFormatter extends Formatter {
public static final String ANSI_RESET = "\u001B[0m";
public static final String ANSI_BLACK = "\u001B[30m";
public static final String ANSI_RED = "\u001B[31m";
public static final String ANSI_GREEN = "\u001B[32m";
public static final String ANSI_YELLOW = "\u001B[33m";
public static final String ANSI_BLUE = "\u001B[34m";
public static final String ANSI_PURPLE = "\u001B[35m";
public static final String ANSI_CYAN = "\u001B[36m";
public static final String ANSI_WHITE = "\u001B[37m";
public static final String ANSI_BLACK_BACKGROUND = "\u001B[40m";
public static final String ANSI_RED_BACKGROUND = "\u001B[41m";
public static final String ANSI_GREEN_BACKGROUND = "\u001B[42m";
public static final String ANSI_YELLOW_BACKGROUND = "\u001B[43m";
public static final String ANSI_BLUE_BACKGROUND = "\u001B[44m";
public static final String ANSI_PURPLE_BACKGROUND = "\u001B[45m";
public static final String ANSI_CYAN_BACKGROUND = "\u001B[46m";
public static final String ANSI_WHITE_BACKGROUND = "\u001B[47m";
private final Date date = new Date();
// FORMAT uses e.g. 2$ which refers to 2nd argument of String.format
// It has two lines: Line 1 is the date and class/method. Line 2 is the LEVEL and message
// Lines are separated by the format spec %n which makes newline
// This format puts date and class/method in CYAN, followed by newline with level colored, followed by default message color
private static final String FORMAT = ANSI_CYAN+"%2$tb %2$td, %2$tY %2$tl:%2$tM:%2$tS %2$Tp %3$s%n%1$s%5$s:" + ANSI_RESET + " %6$s%7$s%n";
// args to String.format
// 1 ansi code
// 2 date
// 3 source (class/method)
// 4 logger name
// 5 level
// 6 message,
// 7 throwable
// output example
// Jan 05, 2021 7:09:55 AM net.sf.jaer.eventprocessing.filter.BackgroundActivityFilter resetFilter
//INFO: resetting BackgroundActivityFilter
@Override
public String format(LogRecord record) {
date.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_GREEN_BACKGROUND+ANSI_BLACK, date, source, record.getLoggerName(),
record.getLevel().getLocalizedName(), message + ANSI_RESET, throwable);
case "WARNING":
return String.format(FORMAT, ANSI_YELLOW_BACKGROUND+ANSI_BLACK, date, source, record.getLoggerName(),
record.getLevel().getLocalizedName(), message + ANSI_RESET, throwable);
case "SEVERE":
return String.format(FORMAT, ANSI_RED_BACKGROUND + ANSI_WHITE, date, source, record.getLoggerName(),
record.getLevel().getLocalizedName(), message + ANSI_RESET, throwable);
default:
return String.format(FORMAT, date, source, record.getLoggerName(),
record.getLevel().getLocalizedName(), message, throwable);
}
}
}
它在我的 Logging.properties 中实例化,我在启动时指定
-Djava.util.logging.config.file=conf/Logging.properties
Logging.properties有这一行
java.util.logging.ConsoleHandler.formatter = net.sf.jaer.util.LoggingAnsiColorConsoleFormatter
输出是这样的
目前,我所有的 INFO、SEVERE 和 FINE 日志都是用红色打印的。我想将 INFO 和 FINE 日志更改为白色。
我发现很多文章都是通过创建一个新的 Fommater 来改变颜色的。我想知道如何通过修改 logging.properties?
来更改打印颜色我正在使用 Java 默认日志记录库 Util.Logging.Logger
环境:
- Ecipse 2018-12 (4.10.0)
- Windows 10
Currently, all my INFO, SEVERE and FINE logs are printed with red colour.
这取决于哪个进程正在消耗 System.err
。
- 更改 Standard Out/Standard Error text color,使标准输出为白色,标准错误为红色。
- 创建一个设置为警告级别的常规 ConsoleHandler。这会将所有警告及以上内容定向到红色的 ERR 流。
- 创建一个特殊的Handler to print to Standard OUT并将级别设置为ALL。
- 创建一个 java.util.logging.Filter 来过滤掉标准 OUT 处理程序的大于 INFO 的消息,并将其安装在该处理程序上。
- 将控制台处理程序 (ERR) 和 OUT 处理程序附加到根记录器。
I am wondering how could I change the printing colour by modifying the logging.properties?
您在 logging.properties 中唯一可以做的就是安装一种新型的 Formatter 或第三方处理程序,它们可能能够更改输出颜色,但是,这取决于消耗的控制台输出流的方式呈现(例如 HTML 与 BASH 终端)。
问题是 Eclipse 总是以相同的颜色(在本例中为红色)显示 stderr 输出。它在设置中是可配置的,但对于所有 stderr 流它总是相同的。
我的解决方案是为控制台处理程序使用自定义格式化程序,并根据消息的级别在每条消息之前注入 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 Escape 代码。 安装并重启Eclipse.
上面的代码编译并压缩成一个.jar文件:
- 将上面的代码保存为
CustomFormatter.java
- 用
javac CustomFormatter.java
编译
- 使用
jar cfv CustomFormatter.jar CustomFormatter.class
创建一个包含 Class 文件的 JAR 文件,并将其保存在您想要的任何文件夹中(例如,在C:\java\CustomFormatter
中)
- 将上面的代码保存为
说明
- 转到
Window --> Preferences --> Ansi Console
并检查Try using the standard error color setting for stderr output
,然后Apply and Close
。 编辑
logging.properties
文件,该文件位于 JRE 的lib
文件夹中。您的计算机中可能有多个,您应该编辑与 Eclipse 使用的 JRE 版本相对应的那个。您可以通过阅读 Eclipse 中 "Console" 选项卡下方的内容来了解正在使用哪个:- 使用文本编辑器打开
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
- Select 您正在使用的 JRE,单击
Edit
和Add External JARs...
- 转到您保存
CustomFormatter.jar
和 select 的文件夹。 - 确保它在系统库列表中,然后单击
Finish
和Apply and Close
就是这样。您现在应该为每个 Logger 级别设置不同的颜色。 INFO 为青色,WARNING 为黄色,SEVERE 为红色。您可以通过使用 corresponding ANSI Color code 修改上面的代码来将其更改为您想要的任何颜色。它适用于 java 8 和 Eclipse 2019-12:
- 转到
注意: 如果正常的标准输出文本显示为蓝色、红色或黄色,请尝试在 Window --> Preferences --> Run/Debug --> Console
Limit console output
jajube 的回答很棒。我使用 netbeans 8.2。它的控制台有默认的红色文本,但处理 ANSI 代码。我修改了他对下面格式化程序的回答
package net.sf.jaer.util;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.Date;
import java.util.logging.Formatter;
import java.util.logging.LogRecord;
/**
* Based on
*
* with ANSI codes from
*
*
* @author tobid Jan 2021
*/
public class LoggingAnsiColorConsoleFormatter extends Formatter {
public static final String ANSI_RESET = "\u001B[0m";
public static final String ANSI_BLACK = "\u001B[30m";
public static final String ANSI_RED = "\u001B[31m";
public static final String ANSI_GREEN = "\u001B[32m";
public static final String ANSI_YELLOW = "\u001B[33m";
public static final String ANSI_BLUE = "\u001B[34m";
public static final String ANSI_PURPLE = "\u001B[35m";
public static final String ANSI_CYAN = "\u001B[36m";
public static final String ANSI_WHITE = "\u001B[37m";
public static final String ANSI_BLACK_BACKGROUND = "\u001B[40m";
public static final String ANSI_RED_BACKGROUND = "\u001B[41m";
public static final String ANSI_GREEN_BACKGROUND = "\u001B[42m";
public static final String ANSI_YELLOW_BACKGROUND = "\u001B[43m";
public static final String ANSI_BLUE_BACKGROUND = "\u001B[44m";
public static final String ANSI_PURPLE_BACKGROUND = "\u001B[45m";
public static final String ANSI_CYAN_BACKGROUND = "\u001B[46m";
public static final String ANSI_WHITE_BACKGROUND = "\u001B[47m";
private final Date date = new Date();
// FORMAT uses e.g. 2$ which refers to 2nd argument of String.format
// It has two lines: Line 1 is the date and class/method. Line 2 is the LEVEL and message
// Lines are separated by the format spec %n which makes newline
// This format puts date and class/method in CYAN, followed by newline with level colored, followed by default message color
private static final String FORMAT = ANSI_CYAN+"%2$tb %2$td, %2$tY %2$tl:%2$tM:%2$tS %2$Tp %3$s%n%1$s%5$s:" + ANSI_RESET + " %6$s%7$s%n";
// args to String.format
// 1 ansi code
// 2 date
// 3 source (class/method)
// 4 logger name
// 5 level
// 6 message,
// 7 throwable
// output example
// Jan 05, 2021 7:09:55 AM net.sf.jaer.eventprocessing.filter.BackgroundActivityFilter resetFilter
//INFO: resetting BackgroundActivityFilter
@Override
public String format(LogRecord record) {
date.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_GREEN_BACKGROUND+ANSI_BLACK, date, source, record.getLoggerName(),
record.getLevel().getLocalizedName(), message + ANSI_RESET, throwable);
case "WARNING":
return String.format(FORMAT, ANSI_YELLOW_BACKGROUND+ANSI_BLACK, date, source, record.getLoggerName(),
record.getLevel().getLocalizedName(), message + ANSI_RESET, throwable);
case "SEVERE":
return String.format(FORMAT, ANSI_RED_BACKGROUND + ANSI_WHITE, date, source, record.getLoggerName(),
record.getLevel().getLocalizedName(), message + ANSI_RESET, throwable);
default:
return String.format(FORMAT, date, source, record.getLoggerName(),
record.getLevel().getLocalizedName(), message, throwable);
}
}
}
它在我的 Logging.properties 中实例化,我在启动时指定
-Djava.util.logging.config.file=conf/Logging.properties
Logging.properties有这一行
java.util.logging.ConsoleHandler.formatter = net.sf.jaer.util.LoggingAnsiColorConsoleFormatter
输出是这样的