- 封装类:
-
System
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 Summary
-
Method Summary
Modifier and TypeMethodDescriptiongetLocalizedLogger
(String name, ResourceBundle bundle, Module module) 为给定的module
返回一个可本地化的Logger
实例。abstract System.Logger
为给定的module
返回一个Logger
实例。static System.LoggerFinder
返回LoggerFinder
实例。
-
Constructor Details
-
LoggerFinder
protected LoggerFinder()创建一个新的LoggerFinder
实例。- 实现注意事项:
-
建议
LoggerFinder
服务实现在其构造函数中不执行任何繁重的初始化,以避免在实例化服务提供程序时可能出现死锁或类加载循环的风险。 - 抛出:
-
SecurityException
- 如果存在安全管理器且其checkPermission
方法不允许RuntimePermission("loggerFinder")
。
-
-
Method Details
-
getLogger
为给定的module
返回一个Logger
实例。- 参数:
-
name
- 日志记录器的名称。 -
module
- 请求日志记录器的模块。 - 返回:
-
适用于给定模块的
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")
。
-