Module java.base
Package java.lang

Class 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服务的实现。

默认实现

系统默认的LoggerFinder实现在存在java.logging模块时使用java.util.logging作为后端框架。它返回一个logger实例,将日志消息路由到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中所述。

自JDK版本:
9
参见:
  • Constructor Details

    • LoggerFinder

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

    • getLogger

      public abstract System.Logger getLogger(String name, Module module)
      为给定的module返回一个Logger实例。
      参数:
      name - 日志记录器的名称。
      module - 请求日志记录器的模块。
      返回:
      适用于给定模块的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")