- 封闭类:
System
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
- 参见:
-
构造方法总结
构造方法 -
方法总结
修饰符和类型方法描述getLocalizedLogger
(String name, ResourceBundle bundle, Module module) 为给定的module
返回Logger
的可本地化实例。abstract System.Logger
返回给定module
的Logger
实例。static System.LoggerFinder
返回LoggerFinder
实例。
-
构造方法详细信息
-
LoggerFinder
protected LoggerFinder()创建LoggerFinder
的新实例。- 实现注意事项:
-
建议
LoggerFinder
服务实现不要在其构造函数中执行任何繁重的初始化,以避免在服务提供者实例化期间可能出现死锁或类加载循环的风险。 - 抛出:
SecurityException
- 如果存在安全管理器并且其checkPermission
方法不允许RuntimePermission("loggerFinder")
。
-
-
方法详情
-
getLogger
返回给定module
的Logger
实例。- 参数:
name
- 记录器的名称。module
- 请求记录器的模块。- 返回:
-
a
logger
适合在给定模块内使用。 - 抛出:
NullPointerException
- 如果name
是null
或module
是null
。SecurityException
- 如果存在安全管理器并且其checkPermission
方法不允许RuntimePermission("loggerFinder")
。
-
getLocalizedLogger
为给定的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
- 如果name
是null
或module
是null
。SecurityException
- 如果存在安全管理器并且其checkPermission
方法不允许RuntimePermission("loggerFinder")
。
-
getLoggerFinder
- 返回:
LoggerFinder
实例。- 抛出:
SecurityException
- 如果存在安全管理器并且其checkPermission
方法不允许RuntimePermission("loggerFinder")
。
-