将log4j 2.10.0与Java 9 System.Logger一起使用

XDR*_*XDR 5 java logging log4j log4j2 java-9

如何设置Java 9以便System.Logger实例写入log4j 2.10.0,而不是写入JUL?

Nic*_*lai 7

这是你提到的段落:

此版本包含Java 9的第一个支持以及错误修正和次要增强功能.Log4j API被修改为用于java.util.ServiceLoader定位Log4j实现,尽管仍支持前一种绑定机制.Log4j jar现在是一个多版本jar,用于提供Java 9特定类的实现.

它没有提及System.LoggerFinder,实际上对于repo(版本2.10)的全文搜索没有提到"LoggerFinder",也没有提到"java.lang.System".因此,我确信Log4J 2.10尚未与JEP 264集成:平台日志记录API和服务.

发布说明似乎指的是Log4J现在ServiceLoader在查找自己的 API 实现时使用API.

自己做

如果你确实需要/希望Log4J记录这些消息,你可以像我在这里为SLF4J那样滚动你自己的适配器.你需要的只是Log4J适配器System.LoggerSystem.LoggerFinder(如果你吝啬一些细节,直接实现)和META-INF/services文件或模块声明,如下所示:

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;
}
Run Code Online (Sandbox Code Playgroud)

使用该工件启动应用程序将导致Log4J获取平台日志消息.

  • 事实证明,自2016年4月以来,[有一个](https://issues.apache.org/jira/browse/LOG4J2-1360). (2认同)

Zhe*_*lov 6

Log4j 2 supports JDK platform logging since version 2.13.2. If you want to use System.Logger with Log4j 2 as a backend, you need to use log4j-jpl adapter:

<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>
Run Code Online (Sandbox Code Playgroud)

After that, your System.Logger will redirect logs to Log4j:

public final class Main {
    private static final Logger LOGGER = System.getLogger("");

    public static void main(String[] args) {
        LOGGER.log(Level.ERROR, "Hello, {}!", "user");
    }
}
Run Code Online (Sandbox Code Playgroud)

Output:

11:02:44.736 [main] ERROR  - Hello, user!
Run Code Online (Sandbox Code Playgroud)