有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何使log4jdk日志适配器打印JUL级别?

我正在将一个API从JUL(JavautilLogging)迁移到Log4J2,因此我必须保持与公开JUL级别的现有方法的兼容性

例如:

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

所以我决定使用log4jdk日志适配器来保持一切正常工作,但是默认布局会打印新的Log4j级别

下面的代码

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

正在生产

ERROR: An issue occurred

我还希望在输出中保留旧的JUL级别,以便迁移对用户透明。 如何更改布局以继续打印旧的七月级别?例如:

SEVERE: An issue occurred

共 (1) 个答案

  1. # 1 楼答案

    您可以执行以下操作:

    创建一个RoutingAppender将适当级别的消息定向到一个appender,该appender可以通过打印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
    

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