使用通用记录器时如何禁用某些 类 的记录?
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 语句。
我按照以下方式在根 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 语句。