jul-to-slf4j仅适用于特定类

时间:2015-11-23 09:27:47

标签: slf4j java.util.logging

我正在使用Websphere Application Server上的Primefaces开发JSF项目。 由于Primefaces使用java.util.logging,我使用jul-to-slf4j Bridge将Primefacs日志捕获到我的Log4J日志文件中。

但是使用jul-to-slf4j Bridge,所有java.util.logging消息都将出现在我的日志文件中,包括一般的Websphere消息,例如" Application started"或者"服务器启动"。

是否可以配置jul-to-slf4j,因此它只会重定向特定的消息(例如,从org.primefaces)到SLF4j的所有内容,并将其余部分保留原样?

1 个答案:

答案 0 :(得分:1)

我找到了使用java.util.logging.Filter的解决方案,过滤器只检查记录器的名称是否以org.primefaces开头:

对于此解决方案,必须以编程方式设置SLF4JBridgeHandler和Filter, 使用logging.properties文件设置它不会工作。

此外,还有一个人要自己创建SLF4JBridgeHandler,由于Bug是什么,SLF4JBridgeHandler不会开箱即用。

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设置的所有其他处理程序!