log4j2本身并不支持直接輸出彩色日志,但可以通過使用log4j2提供的Layout插件和自定義轉換器來實現彩色日志輸出。
首先,在log4j2配置文件中配置一個PatternLayout來定義日志輸出的格式,例如:
<Configuration status="warn" monitorInterval="30">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%highlight{[%d] %-5p [%t] %C{2}.%M:%L - %m%n}{FATAL=red, ERROR=red, WARN=yellow, INFO=blue, DEBUG=green, TRACE=white}"/>
</Console>
</Appenders>
<Loggers>
<Root level="trace">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
在上面的配置中,我們使用了%highlight{}
來定義彩色日志輸出格式,其中{}
內部定義了不同級別日志的顏色,例如FATAL級別的日志為紅色,ERROR級別的日志為紅色,以此類推。
然后,我們需要編寫一個自定義轉換器來處理顏色輸出,例如:
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.pattern.PatternFormatter;
import org.apache.logging.log4j.core.pattern.ThrowablePatternConverter;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;
public class HighlightPatternConverter extends ThrowablePatternConverter {
private static final List<PatternFormatter> FORMATTERS = new ArrayList<>();
static {
FORMATTERS.add(new HighlightPatternFormatter("ERROR", "\u001B[31m")); // red
FORMATTERS.add(new HighlightPatternFormatter("WARN", "\u001B[33m")); // yellow
FORMATTERS.add(new HighlightPatternFormatter("INFO", "\u001B[34m")); // blue
FORMATTERS.add(new HighlightPatternFormatter("DEBUG", "\u001B[32m")); // green
FORMATTERS.add(new HighlightPatternFormatter("TRACE", "\u001B[37m")); // white
FORMATTERS.add(new HighlightPatternFormatter("FATAL", "\u001B[31m")); // red
}
public HighlightPatternConverter(final String[] options) {
super("Highlight", "highlight");
}
@Override
public void format(final LogEvent event, final StringBuilder output) {
final String level = event.getLevel().name();
for (PatternFormatter formatter : FORMATTERS) {
if (formatter.getPattern().equals(level)) {
formatter.format(event, output);
break;
}
}
}
private static class HighlightPatternFormatter extends PatternFormatter {
private final String pattern;
public HighlightPatternFormatter(final String pattern, final String color) {
super(null, null);
this.pattern = pattern;
}
@Override
public void format(final LogEvent event, final StringBuilder output) {
output.append(this.pattern);
super.format(event, output);
output.append("\u001B[0m"); // reset color
}
public String getPattern() {
return this.pattern;
}
}
}
最后,在log4j2配置文件中添加自定義轉換器的引用,例如:
<Configuration status="warn" monitorInterval="30">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%highlight{[%d] %-5p [%t] %C{2}.%M:%L - %m%n}"/>
</Console>
</Appenders>
<Loggers>
<Root level="trace">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
通過以上步驟,我們就可以實現在log4j2中輸出彩色日志了。需要注意的是,不同的終端支持的顏色可能有所不同,可能需要根據實際情況進行調整。