Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java.util.logging.Logger与它的级别不同';s根记录器_Java_Logging_Java.util.logging_Log Level - Fatal编程技术网

java.util.logging.Logger与它的级别不同';s根记录器

java.util.logging.Logger与它的级别不同';s根记录器,java,logging,java.util.logging,log-level,Java,Logging,Java.util.logging,Log Level,在我的应用程序中,我曾将java.util.logging的根记录器及其所有处理程序设置为Level.FINEST,如下所示: Logger.getLogger("").setLevel(Level.FINEST); for (Handler handler : Logger.getLogger("").getHandlers()) { handler.setLevel(Level.FINEST); } private static final Logger JAVA_LOG =

在我的应用程序中,我曾将
java.util.logging
的根记录器及其所有处理程序设置为
Level.FINEST
,如下所示:

Logger.getLogger("").setLevel(Level.FINEST);
for (Handler handler : Logger.getLogger("").getHandlers()) {
      handler.setLevel(Level.FINEST);
}
private static final Logger JAVA_LOG = Logger.getLogger(MyClass.class.getName());
在后面的一点中,我创建了一个类记录器,如下所示:

Logger.getLogger("").setLevel(Level.FINEST);
for (Handler handler : Logger.getLogger("").getHandlers()) {
      handler.setLevel(Level.FINEST);
}
private static final Logger JAVA_LOG = Logger.getLogger(MyClass.class.getName());
现在,这个记录器级别是
INFO
(这似乎是七月的默认值),而它的根记录器级别被正确设置为
FINEST
。设置根记录器的级别不应该同时设置根记录器的所有子记录器的级别吗?我在检索类记录器时是否做错了什么?

设置根记录器的级别不应该同时设置根记录器的所有子记录器的级别吗

不,显然您正在创建一个新的记录器对象。国家:

如果创建了一个新的记录器,其日志级别将根据 LogManager配置,它将配置为也发送 将输出记录到其父处理程序

请注意,即使以前有一个具有相同名称的记录器对象,您也不能依靠
getLogger
返回相同的对象,因为如果没有对该对象的强引用,它可能已被垃圾收集

如果您的目标是在项目中创建具有相同日志级别的所有记录器对象,则不应以编程方式创建,而应通过配置创建。这就是
java.util.logging
方便的地方。总体优势在于,您可以在不同的日志级别上运行应用程序,而无需更改一行代码

只需编辑配置文件(基本上就是上面提到的
LogManager配置
)。它名为
logging.properties
,位于JRE目录中。在那里,您可以编辑最后一段并配置项目范围或类范围的日志级别:

############################################################
# Facility specific properties.
# Provides extra control for each logger.
############################################################

myProject.MyClass.level = FINE
myProject.MyOtherNotSoImportantClass.level = INFO
mySecondProject.MainClass.level = NONE
更好的解决方案是将
logging.properties
复制到您的项目目录中,并使用

java -Djava.util.logging.config.file=./src/test/resources/logging.properties

被接受的答案是完全正确的,我完全同意

也就是说,我想补充一点知识。。。你想怎么做就怎么做

private static final Logger JAVA_LOG = Logger.getLogger(MyClass.class.getName());
static { JAVA_LOG.setLevel(null); }
这将告诉它继承其祖先的日志级别

如果新级别为null,则意味着此节点应使用特定(非null)级别值从其最近的祖先继承其级别


谢谢你的回复。你能告诉我是否有一种方法可以通过编程实现我的要求吗?创建一个设置,以便将来创建具有特定级别的类记录器?@Jdv如果您的记录器不是最终记录器,您可以创建记录器并在静态初始化器中更改其日志级别。但是为什么呢?请参阅更新的答案。