有 Java 编程相关的问题?

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

java将日志重定向到Log4j2

我需要将Jersey请求/响应日志重定向到我的log4j2

我在我的ApplicationJAXRS extends Application上使用以下代码启用了Jersey日志记录:

@Override
public Set<Class<?>> getClasses() {
    return new HashSet<Class<?>>() {{
        add(LoggingFilter.class);
    }};
    }

Jersey似乎在内部使用JUL(Java日志),默认输出是STDOUT。此时,我可以在Eclipse控制台上看到STDOUT

Log4j2文档中有一个关于JDK Logging Adapter的部分。 上面写着

To use the JDK Logging Adapter, you must set the system property java.util.logging.manager to org.apache.logging.log4j.jul.LogManager

This must be done either through the command line (i.e., using the -Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager argument) or by using System.setProperty() before any calls are made to LogManager or Logger.

要在任何记录器调用之前调用System.setProperty(*),我已经尝试将它放在Aplication类中的@PostConstruct

@PostConstruct
    public void init() {
        System.setProperty("java.util.logging.manager", "org.apache.logging.log4j.jul.LogManager");
    }

我可以让它登录我的日志文件

这是我的log4j2。xml:

    <Appenders>
        <RollingFile name="RollingFile" fileName="${log-path}/${name}.log" 
            filePattern="${log-path}/${date:yyyy-MM}/${name}-%d{yyyy-MM-dd}-%i.log">
            <PatternLayout>
                <Pattern>%d{dd-MM-yy HH:mm:ss,SSS} %-5p [%t] (%F:%L) - %m%n</Pattern>
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
            </Policies>
            <DefaultRolloverStrategy max="10" />
        </RollingFile>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d %-5p [%t] %C{2} (%F:%L) - %m%n" />
        </Console>
    </Appenders>
    <Loggers>
        <Root level="debug">
            <AppenderRef ref="Console" level="debug"/>
            <AppenderRef ref="RollingFile" level="debug"/>
        </Root>
    </Loggers>
</Configuration>

共 (2) 个答案

  1. # 1 楼答案

    这实际上适用于Jersey案例,尽管您仍然需要设置系统属性java。util。登录中。manager=org。阿帕奇。登录中。log4j。七月,后勤经理

    将logger实例化为普通的log4j2,用于一般应用程序日志记录。然后,显式地实例化一个java。util。登录中。使用org的记录器。阿帕奇。登录中。log4j。七月,经理。然后,第二个Logger实例用于注册一个新的LoggingFilter,如图所示,在本例中使用Jersey 2客户端(为了清晰起见,使用详细的命名):

    org.apache.logging.log4j.Logger logger = org.apache.logging.log4j.LogManager.getLogger(this.getClass().getName());
    
    java.util.logging.Logger jerseyLogger = org.apache.logging.log4j.jul.LogManager.getLogManager().getLogger(this.getClass().getName());
    
    jerseyLogger.setLevel(java.util.logging.Level.SEVERE); //OPTIONAL
    
    Client client = ClientBuilder.newClient();
    client.register(new LoggingFilter(jerseyLogger, false));
    
    logger.info("App logging uses the normal logger");
    

    现在,对记录器的调用按预期工作,Jersey的所有jul日志输出按预期定向回log4j2 appenders

  2. # 2 楼答案

    我想你必须设置system property at launch。向init方法中添加代码,查看设置系统属性是否有效

    @PostConstruct
    public void init() {
        String cn = "org.apache.logging.log4j.jul.LogManager";
        System.setProperty("java.util.logging.manager", cn);
        LogManager lm = LogManager.getLogManager();
        if (!cn.equals(lm.getClass().getName())) {
           try {
               ClassLoader.getSystemClassLoader().loadClass(cn);
           } catch (ClassNotFoundException cnfe) {
              throw new IllegalStateException("Jars not in system class path.", cnfe);
           }
           throw new IllegalStateException("Found " + lm.getClass().getName() + " set as launch param instead.");
        }
    }