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

时间:2015-11-05 06:42:29

标签: java eclipse logging configure java.util.logging

我在以下方式的基类中创建了一个通用记录器,该类由许多子类引用。

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

然后我以下列方式访问子类中的记录器。

private static final Logger LOGGER = RootClass.LOGGER;

我有一个主类接收来自用户的输入,它调用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;
}

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

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

为了满足您的要求,您必须创建一个自定义log filter来检查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");
    }
}

此外,level类有一个parse方法可用于摆脱该switch语句。

答案 2 :(得分:0)

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