我在以下方式的基类中创建了一个通用记录器,该类由许多子类引用。
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;
}
我是否可以禁用某些选定子类的日志记录?我有一个要求,用户应该能够设置应为其创建日志的某些子类。但由于我在所有子类中使用通用记录器,我不知道如何实现这一点。请指教。
答案 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)
如果所有其他方法都失败了,您可以随时查看调用堆栈并查看调用函数的位置。也许不是最有效的解决方案,但它应该适用于您的情况。