模块 java.base
 java.lang

类 System.LoggerFinder

java.lang.Object
java.lang.System.LoggerFinder
封闭类:
System

public abstract static class System.LoggerFinder extends Object
LoggerFinder 服务负责创建、管理和配置记录器到它使用的底层框架。记录器查找器是此类的具体实现,它具有零参数构造函数并实现此类定义的抽象方法。从记录器查找器返回的记录器能够将日志消息路由到此提供程序支持的日志记录后端。给定的 Java 运行时调用维护一个系统范围的 LoggerFinder 实例,该实例按如下方式加载:
  • 首先,它使用带有 系统类加载器ServiceLoader 设施找到任何自定义 LoggerFinder 提供程序。
  • 如果未找到 LoggerFinder 提供程序,将使用系统默认的 LoggerFinder 实现。

应用程序可以替换日志记录后端即使存在 java.logging 模块,通过简单地提供和声明 System.LoggerFinder 服务的实现。

默认实现

当存在 java.logging 模块时,系统默认 LoggerFinder 实现使用 java.util.logging 作为后端框架。它返回一个 记录器 实例,该实例将日志消息路由到 java.util.logging.Logger 。否则,如果 java.logging 不存在,则默认实现将返回一个简单的记录器实例,它将 INFO 级别及以上级别的日志消息路由到控制台 (System.err)。

记录配置

LoggerFinder 工厂方法获得的 Logger 实例不能由应用程序直接配置。配置是底层日志记录后端的责任,通常需要使用特定于该后端的 API。

对于使用 java.util.logging 作为其后端的默认 LoggerFinder 实现,请参阅 java.util.logging 以了解日志记录配置。对于在 java.logging 模块不存在时返回简单记录器的默认 LoggerFinder 实现,配置依赖于实现。

通常,使用日志框架的应用程序将通过该框架定义(或支持)的记录器外观来记录消息。希望使用外部框架的应用程序应该通过与该框架关联的外观进行登录。

需要记录消息的系统类通常会获得一个 System.Logger 实例,以将消息路由到应用程序选择的日志记录框架。

只需要记录器来生成日志消息的库和类不应尝试自己配置记录器,因为这会使它们依赖于 LoggerFinder 服务的特定实现。

此外,当存在安全管理器时,提供给系统类的记录器不应在不需要权限的情况下通过日志记录后端直接配置。
具体 LoggerFinder 实现的提供者有责任确保这些记录器不会在未经适当权限检查的情况下由不受信任的代码配置,因为在此类记录器上执行的配置通常会影响同一 Java 运行时中的所有应用程序。

消息级别和映射到后端级别

记录器查找器负责从 System.Logger.Level 映射到它使用的日志记录后端支持的级别。
使用 java.util.logging 作为后端的默认 LoggerFinder 将 System.Logger 级别映射到相应严重性的 java.util.logging 级别 - 如 Logger.Level 中所述。

自从:
9
参见:
  • 构造方法详细信息

    • LoggerFinder

      protected LoggerFinder()
      创建 LoggerFinder 的新实例。
      实现注意事项:
      建议 LoggerFinder 服务实现不要在其构造函数中执行任何繁重的初始化,以避免在服务提供者实例化期间可能出现死锁或类加载循环的风险。
      抛出:
      SecurityException - 如果存在安全管理器并且其 checkPermission 方法不允许 RuntimePermission("loggerFinder")
  • 方法详情

    • getLogger

      public abstract System.Logger  getLogger(String  name, Module  module)
      返回给定 moduleLogger 实例。
      参数:
      name - 记录器的名称。
      module - 请求记录器的模块。
      返回:
      a logger 适合在给定模块内使用。
      抛出:
      NullPointerException - 如果 namenullmodulenull
      SecurityException - 如果存在安全管理器并且其 checkPermission 方法不允许 RuntimePermission("loggerFinder")
    • getLocalizedLogger

      public System.Logger  getLocalizedLogger(String  name, ResourceBundle  bundle, Module  module)
      为给定的 module 返回 Logger 的可本地化实例。返回的记录器将使用提供的资源包进行消息本地化。
      实现要求:
      默认情况下,此方法调用 this.getLogger(name, module) 来获取记录器,然后将该记录器包装在一个 System.Logger 实例中,其中所有不采用 ResourceBundle 作为参数的方法都被重定向到一个接受参数的方法 - 传递给定的 bundle 以进行本地化。因此,例如,对 Logger.log(Level.INFO, msg) 的调用最终将作为对包装记录器实例上的 Logger.log(Level.INFO, bundle, msg, (Object[])null) 的调用而结束。但是请注意,默认情况下,Supplier<String> 返回的字符串消息不会被本地化,因为假定此类字符串是已经构建的消息,而不是资源包中的键。

      LoggerFinder 的实现可能会覆盖此方法,例如,当底层日志记录后端提供自己的本地化日志消息机制时,这样的 LoggerFinder 将可以自由返回直接使用后端提供的机制的记录器。

      参数:
      name - 记录器的名称。
      bundle - 资源包;可以是 null
      module - 请求记录器的模块。
      返回:
      Logger 的实例,它将使用提供的资源包进行消息本地化。
      抛出:
      NullPointerException - 如果 namenullmodulenull
      SecurityException - 如果存在安全管理器并且其 checkPermission 方法不允许 RuntimePermission("loggerFinder")
    • getLoggerFinder

      public static System.LoggerFinder  getLoggerFinder()
      返回 LoggerFinder 实例。 Java 运行时中只有一个系统范围的 LoggerFinder 实例。请参阅有关如何定位和加载 LoggerFinder 实现的类规范。
      返回:
      LoggerFinder 实例。
      抛出:
      SecurityException - 如果存在安全管理器并且其 checkPermission 方法不允许 RuntimePermission("loggerFinder")