获取 org.apache.commons.logging.LogConfigurationException

Getting org.apache.commons.logging.LogConfigurationException

我正在努力将 log4j1.x 升级到 log4j2.x。为此,我将 log4j1.x 替换为 log4j2.17.1(同时获取 log4j-core 和 api)并且我的 pom 文件具有版本 1.2 的 commons-logging。我用 log4j2.properties 文件替换了 log4j.properties。部署更改后,在 EC2 实例中出现以下错误。

Exception in thread "main" java.lang.ExceptionInInitializerError
Caused by: org.apache.commons.logging.LogConfigurationException: User-specified log class 'org.apache.commons.logging.impl.Log4JLogger' cannot be found or is not useable.
    at org.apache.commons.logging.impl.LogFactoryImpl.discoverLogImplementation(LogFactoryImpl.java:804)
    at org.apache.commons.logging.impl.LogFactoryImpl.newInstance(LogFactoryImpl.java:541)
    at org.apache.commons.logging.impl.LogFactoryImpl.getInstance(LogFactoryImpl.java:292)
    at org.apache.commons.logging.impl.LogFactoryImpl.getInstance(LogFactoryImpl.java:269)
    at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:655)

Pom 文件:

<dependency>
        <groupId>commons-logging</groupId>
        <artifactId>commons-logging</artifactId>
        <version>1.2</version>
    </dependency>
    
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <version>2.17.1</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-api</artifactId>
        <version>2.17.1</version>
    </dependency>

我有 commons-logging.properties 文件,其中包含以下代码。

org.apache.commons.logging.Log = org.apache.commons.logging.impl.Log4JLogger

在我的项目中,他们使用了如下所述的记录器:

A.java

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class A{
public static Log logger = LogFactory.get(A.class);
}

谁能帮我解决这个问题。

您明确配置 Jakarta Commons Logging 以使用 Log4j 1.x。由于类路径中没有它,因此会生成错误。

注意 Log4j 1.x 和 Log4j 2.x 不兼容。要将 JCL 绑定到 Log4j 2.x,您需要:

  • remove/comment commons-logging.properties 中强制 JCL 使用 Log4j 的条目 1.x,

  • 添加适当的 Log4j 2.x 绑定:

    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-jcl</artifactId>
        <version>2.17.1</version>
        <scope>runtime</scope>
    </dependency>
    

编辑:关于:因为log4j-jclcommons-logging有传递依赖,你可以从POM文件中删除后者(并使用 log4j-jcl 的默认 compile 作用域)。

然而,通常的做法是将您直接在代码中使用的所有工件添加为 compile 依赖项(参见 Maven's dependency:analyze goal)并且不依赖传递依赖项(这可以改变).因此,您应该在 compile 范围内同时拥有 commons-logging,在 runtime 范围内拥有 log4j-jcl

你也可以考虑从JCL换成Log4j2.xAPI,这样更容易使用(cf.documentation)。在这种情况下,您应该从依赖项中删除 commons-logging,但保留 log4j-jcl 以允许您的其他依赖项使用 JCL。