log4j 正在获取组织的apache.commons.logging,日志配置异常

slsn1g29  于 2022-11-06  发布在  Apache
关注(0)|答案(1)|浏览(169)

我正在将log4j1.x升级到log4j2.x。为此,我将log4j1.x替换为log4j2.17.1(同时获得log4j-core和api),并且我的pom文件具有版本1.2的commons-logging。我已将www.example.com替换为log4j.propertieslog4j2.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);
}

谁能帮帮我。

carvr3hs

carvr3hs1#

您显式地配置了Jakarta Commons Logging以使用Log4j 1.x。由于类路径上没有它,因此会生成一个错误。
请注意Log4j 1.x和Log4j 2.x不兼容。要将JCL绑定到Log4j 2.x,您需要:

  • 删除/注解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切换到Log4j 2.x API,后者更易于使用(参见documentation)。在这种情况下,您应该从依赖项中删除commons-logging,但保留log4j-jcl以允许其他依赖项使用JCL。

相关问题