【问题标题】:jul-to-slf4j for specific classes onlyjul-to-slf4j 仅适用于特定课程
【发布时间】:2015-11-23 09:27:46
【问题描述】:

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

但是使用 jul-to-slf4j 桥,所有 java.util.logging 消息都将在我的日志文件中,包括一般的 Websphere 消息,如“应用程序已启动”或“服务器已启动”。

可以配置 jul-to-slf4j,因此它只将特定消息(例如,来自 org.primefaces 的所有消息)重定向到 SLF4j,其余的保持原样吗?

【问题讨论】:

    标签: slf4j java.util.logging


    【解决方案1】:

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

    对于此解决方案,必须以编程方式设置 SLF4JBridgeHandler 和过滤器, 用 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 设置的所有其他处理程序!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-31
      • 2016-04-01
      • 1970-01-01
      相关资源
      最近更新 更多