gpt4 book ai didi

java - 如何使 Log4j JDK 日志适配器打印 JUL 级别?

转载 作者:行者123 更新时间:2023-12-02 02:55:17 25 4
gpt4 key购买 nike

我正在将 API 从 JUL(Java Util Logging)迁移到 Log4j 2,因此我必须保持公开 JUL 级别的现有方法的兼容性。

例如:

log(java.util.logging.Level level, String message)

因此,我决定使用 Log4j JDK 日志适配器来保持一切正常运行,但默认布局会打印新的 Log4j 级别。

以下代码

Logger.getLogger("bla").severe("An issue occurred");

正在制作

ERROR: An issue occurred

我想在输出中保留旧的 JUL 级别,以便迁移对用户来说是透明的。如何更改布局以继续打印旧的 JUL 级别?如下:

SEVERE: An issue occurred

最佳答案

您可以执行以下操作:

创建 RoutingAppender它将适当级别的消息定向到附加程序,该附加程序可以通过打印 JUL 级别名称而不是 log4j 级别名称来处理它们。

用于测试的简单主类:

package main.java;

import java.util.logging.LogManager;
import java.util.logging.Logger;

public class Main {

public static void main(String[] args) {
Logger logger = LogManager.getLogManager().getLogger(Main.class.getName());

//Must set the level to FINEST in the code because the config file will not understand a custom level.
logger.setLevel(Level.FINEST);

logger.info("info lvl");
logger.finest("finest lvl");
logger.finer("finer lvl");
logger.fine("fine lvl");
logger.config("config lvl");
logger.warning("warning lvl");
logger.severe("severe lvl");
}

}

Log4j2.xml配置:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn">

<Appenders>
<Console name="consoleAppender" target="SYSTEM_OUT">
<PatternLayout pattern="%p{WARN=WARNING, DEBUG=FINE, ERROR=SEVERE, TRACE=FINER}: %m%n" />
</Console>

<Console name="customLevelAppender" target="SYSTEM_OUT">
<PatternLayout pattern="%p: %m%n"/>
</Console>

<Routing name="Routing">
<Routes>
<Script name="RoutingInit" language="JavaScript"><![CDATA[
logEvent.getLevel();]]>
</Script>
<Route ref="customLevelAppender" key="CONFIG" />
<Route ref="customLevelAppender" key="FINEST" />
<Route ref="consoleAppender" />
</Routes>
</Routing>

</Appenders>

<Loggers>
<Logger name="main.java" level="trace" additivity="false">
<AppenderRef ref="Routing" />
</Logger>
<Root level="info">
<AppenderRef ref="consoleAppender" />
</Root>
</Loggers>
</Configuration>

示例输出:

INFO: info lvl
FINEST: finest lvl
FINER: finer lvl
FINE: fine lvl
CONFIG: config lvl
WARNING: warning lvl
SEVERE: severe lvl

注意:似乎由于 FINEST 和 CONFIG 是自定义级别,因此无法以与其他级别相同的方式处理它们。这就是为什么需要名为“customLevelAppender”的第二个附加程序以及该附加程序不需要任何特殊配置的原因。

关于java - 如何使 Log4j JDK 日志适配器打印 JUL 级别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43190795/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com