2017-04-03 105 views
0

我正在將JUL(Java Util Logging)中的API遷移到Log4j 2,因此我必須在公開JUL級別的現有方法上保持兼容性。如何使Log4j JDK日誌記錄適配器打印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 

回答

2

你可以做到以下幾點:

創建RoutingAppender指導相應級別的消息,可以通過打印JUL級別名稱,而不是log4j的級別名稱的對付他們一個appender 。

簡單的main類來測試:

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和CON圖是自定義的級別,他們不能像其他人一樣處理。這就是爲什麼需要名爲「customLevelAppender」的第二個appender以及appender不需要任何特殊配置的原因。

相關問題