2015-11-23 53 views
1

我正在使用Websphere Application Server上的Primefaces開發JSF項目。 由於Primefaces使用java.util.logging,因此我使用jul-to-slf4j Bridge將Primefacs日誌捕獲到Log4J日誌文件中。僅適用於特定類的jul-to-slf4j

但是,使用jul-to-slf4j Bridge,所有java.util.logging消息都將位於我的日誌文件中,包括一般的Websphere消息,如「已啓動應用程序」或「已啓動服務器」。

是否可以配置jul-to-slf4j,因此它只會將特定消息(例如從org.primefaces到0123)的所有消息重定向到SLF4j,並保持原樣?

回答

1

我發現使用java.util.logging.Filter,只檢查,如果logger的名稱與org.primefaces開始過濾器的解決方案:

對於這個解決方案,就必須設置SLF4JBridgeHandler和篩選程序, 與設置它logging.properties文件不會工作。

此外,還有一個人自己創建了SLF4JBridgeHandler,因爲SLF4JBridgeHandler並不尊重過濾器,所以它是一個Bug

SLF4JBridgeHandler slf4jBridgeHandler = new SLF4JBridgeHandler(){ 
    @Override 
    public void publish(LogRecord record) { 
     if (getFilter() != null && !getFilter().isLoggable(record)) { 
       return; 
      } 
     super.publish(record); 
    } 
}; 

Filter filter = new Filter() { 

    @Override 
    public boolean isLoggable(LogRecord record) { 
     String loggerName = record.getLoggerName(); 
     boolean loggable = loggerName != null && (loggerName.startsWith("org.primefaces")); 
     return loggable; 
    } 
}; 
slf4jBridgeHandler.setFilter(filter); 
java.util.logging.LogManager.getLogManager().getLogger("").addHandler(slf4jBridgeHandler); 

不要調用SLF4JBridgeHandler.removeHandlersForRootLogger(),因爲這會刪除由Websphere設置的每個其他處理程序!

相關問題