Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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类启用精细日志记录_Java_Logging - Fatal编程技术网

如何为单个java类启用精细日志记录

如何为单个java类启用精细日志记录,java,logging,Java,Logging,我正在我的程序中使用日志记录。如何为单个类启用FINE日志记录,同时为每个其他类将其设置为WARNING 我更喜欢在我的main()方法中以编程的方式完成这项工作,而不需要设置其他属性文件。我相信您可以将处理程序和特定类记录器的日志级别设置为良好,在剩下的代码库中保留所有其他的记录器s以发出警告时,应该可以做到这一点。记录器和处理程序都需要通过级别过滤器才能记录消息 如果您不想为每个有问题的类定义一个记录器,而是想在类之间共享记录器,您也可以实现自己的java.util.logging.Hand

我正在我的程序中使用日志记录。如何为单个类启用
FINE
日志记录,同时为每个其他类将其设置为
WARNING


我更喜欢在我的
main()
方法中以编程的方式完成这项工作,而不需要设置其他属性文件。

我相信您可以将
处理程序和特定类
记录器的日志级别设置为良好,在剩下的代码库中保留所有其他的
记录器
s以发出警告时,应该可以做到这一点。
记录器
处理程序
都需要通过级别过滤器才能记录消息

如果您不想为每个有问题的类定义一个记录器,而是想在类之间共享记录器,您也可以实现自己的java.util.logging.Handler,它有自己的方式使用LogRecord.getSourceClassName()提供的信息过滤类名。

,这是我添加到邮件类中的一个方法,它实际上正在工作。我仍然欢迎其他人的任何改进

Logger log = Logger.getLogger(this.getClass().getName()).setLevel(Level.FINE);
private static void setupLogging() {
  // To enable FINE logging in a single class, apparently this bewildering
  // maze of statements is required.
  Logger.getLogger("").setLevel(Level.FINE);
  for (Handler handler : Logger.getLogger("").getHandlers()) {
    handler.setLevel(Level.FINE);
  }
  MyOtherClass.logger.setLevel(Level.FINE);
  Logger.getLogger("").setLevel(Level.WARNING);
}

我知道OP已经要求通过编程来实现这一点,但这里有一个如何在属性文件中实现的示例

警告:我认为这是值得包含的,因为标题并没有以编程方式表示,许多开发人员希望通过logging.properties来管理它。此外,网上也没有太多关于这一点的信息,它可能会让人困惑,并且与log4j稍有不同

根日志记录级别由
.level
配置指示。这决定了默认情况下捕获和“分发”日志记录的事件。根日志级别是日志层次结构中“根日志记录器”使用的级别。看

下面,根日志级别设置为警告,因此通常只捕获警告事件。这由层次结构中的所有子记录器继承,除非您另行配置(稍后):

此根日志记录级别仅指示捕获的内容,而不是“分布式”的内容。捕获事件(消息)的分发方式取决于与记录器关联的处理程序。例如,ConsoleHandler会将事件输出到控制台。例如:

java.util.logging.ConsoleHandler.level = WARNING
此ConsoleHandler.level指示此处理程序应为其分发或打印消息的级别。因此,如果通过上述配置接收到一条精细消息,那么这个处理程序将不会打印它。它将打印任何警告日志级别或更高级别的消息

设置为ALL将确保ConsoleHandler将所有消息打印到控制台(此外,我们还需要配置根级别以确保捕获所有消息):

然而,这会产生很多我们也不想要的噪音。因此,为了将精细级别事件减少到我们感兴趣的类,我们只更改这些特定记录器的日志级别:

com.level = WARNING
com.mypackage.MyClass1.level = FINE
com.mypackage.MyClass2.level = FINE
com.mypackage.mysubpackage.MyClass3.level = FINE

请注意,在上面,我明确地将“com”记录器的级别设置为“警告”。

这很接近,但由于两个原因不起作用:1)我希望能够将代码放在我的主类中,因此不是我的实用程序类的所有用户都必须看到精细的日志记录。2) 看起来,即使我按照你的建议去做,处理者仍然在吞咽我所有的好消息。基本上和你的问题一样。
.level=ALL
java.util.logging.ConsoleHandler.level = ALL
com.level = WARNING
com.mypackage.MyClass1.level = FINE
com.mypackage.MyClass2.level = FINE
com.mypackage.mysubpackage.MyClass3.level = FINE