【问题标题】:How can I disable logging from certain classes when using a common logger?使用通用记录器时,如何禁用某些类的记录?
【发布时间】:2016-02-05 21:51:35
【问题描述】:

我在一个被许多子类引用的根类中按以下方式创建了一个通用记录器。

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;
}

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 我不能使用它来关闭子类的日志,因为这些子类正在使用根类的记录器。当我在这些类中使用通用记录器时,有什么方法可以做到这一点?我必须使用通用记录器,因为我需要将所有类的输出放入单个日志文件中。
    • 请注意,您必须防止此 Logger 引用被 GC'd,否则它将被撤消。
    【解决方案2】:

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

    此外,关卡类有一个 parse 方法,您可以使用该方法摆脱该 switch 语句。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 我需要一种方法来关闭某些类的日志,因为这是确切的要求:(
      猜你喜欢
      • 2020-07-11
      • 2012-05-28
      • 2021-10-18
      • 1970-01-01
      • 1970-01-01
      • 2020-04-05
      • 2014-04-13
      • 1970-01-01
      • 2011-06-25
      相关资源
      最近更新 更多