使用通用记录器时如何禁用某些 类 的记录?

How can I disable logging from certain classes when using a common logger?

我按照以下方式在根 class 中创建了一个公共记录器,该根 class 被许多子 classes 引用。

public static final Logger LOGGER = Logger.getLogger(RootClass.class.getName()); 

然后我通过以下方式在子 classes 中访问该记录器。

private static final Logger LOGGER = RootClass.LOGGER;

我有一个主要的 classes,它接收用户的输入,它调用 RootClass 中的一个方法来配置记录器。

logStatus = messageBus.configureLogPath(logPath,logLevel);

下面是上述方法的实现。

public Boolean configureLogPath(String logPath,String level) {
    Boolean result=false;
    switch(level) {
        case "info" :
            LOGGER.setLevel(Level.INFO);
            break;
        case "severe":
            LOGGER.setLevel(Level.SEVERE);
            break;
        case "debug":
            LOGGER.setLevel(Level.CONFIG);
            break;
        case "off" :
            LOGGER.setLevel(Level.OFF);
            break;
        default : 
            LOGGER.setLevel(Level.SEVERE);
    }
     try {
        simpleFormatter = new SimpleFormatter();
        logFileHandler = new FileHandler(logPath);
        logFileHandler.setFormatter(simpleFormatter);


        LOGGER.addHandler(logFileHandler);
        result =true;
    } catch (SecurityException e1) {
        result= false;
        LOGGER.log(Level.SEVERE, "Security exception when reading log file" + e1);
    } catch (IOException e1) {
        result = false;
        LOGGER.log(Level.SEVERE, "IO Exception when reading log file" + e1);
    }
    return result;
}

我可以禁用某些选定子 classes 的日志记录吗?我有一个要求,用户应该能够设置某些子 classes 应该为其创建日志。但是由于我在所有子 classes 中使用了一个通用记录器,所以我不确定如何实现这一点。请指教

如果所有其他方法都失败了,您始终可以遍历调用堆栈并查看从何处调用您的函数。也许不是最有效的解决方案,但它应该适用于您的情况。

我们可以提及以下用于从特定 Java 类 注销的代码:

Logger.getLogger("cs.fid.tm.reportingService.config.test1").setLevel(Level.OFF);

为了满足您的要求,您必须创建自定义 log filter that checks the source class name 并将其安装在根记录器上。

public class SourceFilter implements Filter {

    @Override
    public boolean isLoggable(LogRecord record) {
        //Source class can return null so handle it.
        String cn = String.valueOf(record.getSourceClassName());
        return !cn.startsWith("foo.bar.Child1")
                && !cn.startsWith("foo.bar.Child2")
                && !cn.startsWith("foo.bar.Child3");
    }
}

此外,级别 class 有一个 parse 方法,您可以使用它来摆脱那个 switch 语句。