簡體   English   中英

將Jersey JUL重定向到Log4j2

[英]Redirect Jersey JUL logging to Log4j2

我需要將Jersey請求/響應日志重定向到我的log4j2。

我在我的ApplicationJAXRS extends Application上使用此代碼啟用了Jersey日志記錄:

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

看來Jersey在內部使用JUL(Java Logging),默認輸出是STDOUT。 此時我可以在Eclipse控制台上看到STDOUT。

Log4j2文檔有一節關於JDK日志記錄適配器 它說

要使用JDK日志記錄適配器,必須將系統屬性java.util.logging.manager設置為org.apache.logging.log4j.jul.LogManager

這必須通過命令行(即使用-Djava.util.logging.manager = org.apache.logging.log4j.jul.LogManager參數)或在調用任何調用之前使用System.setProperty()來完成。 LogManager或Logger。

要在任何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>

我想你必須在啟動時設置系統屬性 將代碼添加到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.");
    }
}

這實際上適用於Jersey案例,但您仍需要設置System屬性java.util.logging.manager = org.apache.logging.log4j.jul.LogManager

對於常規應用程序日志記錄,log4j2正常實例化您的記錄器。 然后,使用org.apache.logging.log4j.jul.LogManager顯式實例化java.util.logging.Logger。 然后,第二個Logger實例用於注冊新的LoggingFilter,如此處所示,使用Jersey 2 Client作為此示例(為了清晰起見,詳細命名):

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 appender。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM