JUL至SLF4J仅适用于特定班级 [英] jul-to-slf4j for specific classes only

查看:18
本文介绍了JUL至SLF4J仅适用于特定班级的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在Websphere Application Server上开发一个带有PrimeFaces的JSF项目。 由于PrimeFaces使用的是java.util.Logging,因此我使用Jul-to-slf4j桥将Primefacs日志捕获到我的Log4J日志文件中。

但使用Jul-to-slf4j Bridge,所有的java.util.Logging消息都将在我的日志文件中,包括诸如"应用程序已启动"或"服务器已启动"之类的一般Websphere消息。

是否可以将jul-to-slf4j配置为仅将特定消息(例如,从org.primefaces的所有消息)重定向到SLF4j,并保持其余消息不变?

推荐答案

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

对于此解决方案,必须以编程方式设置SLF4JBridgeHandler和筛选器, 使用logging.properties文件设置它将不起作用。

此外,必须自己创建SLF4JBridgeHandler,由于AFAIK aBug,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设置的所有其他处理程序!

这篇关于JUL至SLF4J仅适用于特定班级的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆