如何设置Java 9以便System.Logger
实例写入log4j 2.10.0,而不是写入JUL?
答案 0 :(得分:7)
这是您所指的段落:
此版本包含Java 9的第一个支持以及错误修正和次要增强功能。 Log4j API被修改为使用
java.util.ServiceLoader
来定位Log4j实现,尽管仍支持前一种绑定机制。 Log4j jar现在是一个多版本jar,用于提供Java 9特定类的实现。
它没有提及System.LoggerFinder
实际上the repo(版本2.10)的全文搜索没有提及" LoggerFinder&#34 ;没有什么有希望的" java.lang.System"。因此,我确定Log4J 2.10尚未与JEP 264: Platform Logging API and Service集成。
发行说明似乎指的是Log4J现在在查找自己的 API的实现时使用ServiceLoader
API。
如果您确实需要/希望Log4J记录这些消息,您可以滚动自己的适配器as I did here for SLF4J。您只需要System.Logger
和System.LoggerFinder
的Log4J适配器(如果您吝啬一些细节,可以直接实现)和META-INF/services
文件或类似以下的模块声明:< / p>
module org.slf4j.platform {
// put the right module name here
requires log4j;
provides java.lang.System.LoggerFinder
// put the right class name here
with org.log4J.Log4JSystemLoggerFinder;
}
使用该工件启动应用程序将导致Log4J获取平台日志消息。
答案 1 :(得分:2)
为什么不简单地使用Log4j2的Java util logging adapter将所有JUL日志记录路由到Log4j2?
要启用此功能,请将系统属性java.util.logging.manager
设置为org.apache.logging.log4j.jul.LogManager
,然后将log4j-jul
添加到您的依赖项。
答案 2 :(得分:1)
Log4j 2 支持 JDK 平台日志 since version 2.13.2。如果要将 System.Logger
与 Log4j 2 一起用作后端,则需要使用 log4j-jpl
适配器:
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>${replace.with.right.version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>${replace.with.right.version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-jpl</artifactId>
<version>${replace.with.right.version}</version>
<scope>runtime</scope>
</dependency>
之后,您的 System.Logger
会将日志重定向到 Log4j:
public final class Main {
private static final Logger LOGGER = System.getLogger("");
public static void main(String[] args) {
LOGGER.log(Level.ERROR, "Hello, {}!", "user");
}
}
输出:
11:02:44.736 [main] ERROR - Hello, user!