【问题标题】:SLF4J and Log4j 2 binding Maven dependencySLF4J 和 Log4j 2 绑定 Maven 依赖
【发布时间】:2013-10-01 12:31:17
【问题描述】:

希望是一个简单的问题,但我的 google foo 让我失望了 - 我有一个 maven 项目,我们在其中使用 SLF4J 和 Log4J 1.2 绑定。

我们现在想迁移到 Log4j 2,特别是为了提高性能 - 但是,我一辈子都找不到 log4j 2.0 绑定的 maven 依赖项。我在http://logging.apache.org/log4j/2.x/log4j-slf4j-impl/ 找到了一些注释,但没有提及任何依赖信息。

我也有点困惑,显然有两种方法可以将 slf4j 放在 log4j2 之上(绑定或适配器)

将 slf4j 与 log4j2 绑定的正确方法是什么以及如何定义 maven 依赖项?

在下面的第一个答案之后编辑添加一些代码,我遇到了异常:

线程“主”java.lang.NoSuchMethodError 中的异常: org/apache/logging/log4j/spi/AbstractLoggerWrapper.(Lorg/apache/logging/log4j/spi/AbstractLogger;Ljava/lang/String;)V 在 org.slf4j.impl.SLF4JLogger.(SLF4JLogger.java:48)

POM:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>logging.test</groupId>
<artifactId>logtest2</artifactId>
<version>0.0.1</version>
<name>logtest2</name>
<description>logtest2</description>
<build>
    <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.1</version>
            <configuration>
                <source>1.6</source>
                <target>1.6</target>
            </configuration>
        </plugin>
    </plugins>
</build>
<dependencies>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.5</version>
    </dependency>

    <dependency>
        <groupId>org.apache.logging.log4j.adapters</groupId>
        <artifactId>log4j-slf4j-impl</artifactId>
        <version>2.0-beta3</version>
    </dependency>

    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <version>2.0-beta9</version>
    </dependency>

    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-api</artifactId>
        <version>2.0-beta9</version>
    </dependency>
</dependencies>

我的 log4j.xml:

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd"> <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
    <appender name="A1" class="org.apache.log4j.FileAppender">
        <param name="File" value="c:/logtest2.0/log.txt" />
        <param name="Append" value="false" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d %p %X{sessionId} %c MSG: %m%n" />
        </layout>
    </appender>
    <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d %p %X{sessionId} %c MSG: %m%n" />
        </layout>
    </appender>
    <category name="org.apache.log4j.xml">
        <priority value="debug" />
        <appender-ref ref="A1" />
    </category>
    <root>
        <priority value="debug" />
        <appender-ref ref="STDOUT" />
    </Root> </log4j:configuration>

和我的测试 java 类:

package loggertest;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class LoggerTest {

    public static final Logger LOGGER = LoggerFactory.getLogger(LoggerTest.class);

    public static void main(final String[] p_args) throws InterruptedException {
        LOGGER.debug("Logger test");
    }
}

【问题讨论】:

    标签: java logging binding slf4j log4j2


    【解决方案1】:
    "org.apache.logging.log4j:log4j-slf4j-impl:2.0-beta9" - 
                LOG4J implementation of SLF4J API
    "org.apache.logging.log4j:log4j-core:2.0-beta9" - Core LOG4J implementation
    

    这个,加上类路径上的有效 log4j2.xml 应该可以帮助您开始。

    【讨论】:

    • 谢谢,看来我也需要 log4j-api,但即便如此,slf4j 在线程“main”java.lang.NoSuchMethodError: org/apache/logging/log4j/spi/ 中抛出异常AbstractLoggerWrapper.(Lorg/apache/logging/log4j/spi/AbstractLogger;Ljava/lang/String;)V
    • 对不起,我不小心误导了你,你不需要包含 log4j api 作为依赖项,因为 log4j 核心和 log4j slf4j 实现都依赖它,所以 maven 应该为你获取它们(我已经编辑了答案以反映这一点)。但是,您似乎使用的是org.apache.logging.log4j.adapters:log4j-slf4j-impl:2.0-beta3。改用org.apache.logging.log4j:log4j-slf4j-impl:2.0-beta9
    • 明白了。我也确实找到了它的 apache 文档,我误读了告诉你如何配置 maven 项目的链接,并认为它是指向完全不同的东西的链接!在你和 apache 文档之间,我现在可以正常工作了。 Config 看起来更好,但还没有真正看到“快 10 倍”,在一个有大量线程的测试中,所有的日志都像疯了一样,但我会坚持更详细的测试。再次感谢。
    【解决方案2】:

    如果你想转移使用公共日志记录的 jars,log4j1 和其他也重定向到 slf4j,最后使用 log4j2 实现进行日志记录..这里是需要使用的集合...

    解释:前两个排除了类路径中不存在的 log4j1 和 commons-logging。 log4j-over-slf4j 和 jcl-over-slf4j 提供重定向到 slf4j api 的代理。剩下的是 log4j2 实现依赖。

    <dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
      <version>1.2.17</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>commons-logging</groupId>
      <artifactId>commons-logging</artifactId>
      <version>1.2</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
      <version>1.2.17</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>log4j-over-slf4j</artifactId>
      <version>1.7.7</version>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>1.7.7</version>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>jcl-over-slf4j</artifactId>
      <version>1.7.7</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-slf4j-impl</artifactId>
      <version>2.17.1</version>
    </dependency>
    <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-api</artifactId>
      <version>2.17.1</version>
    </dependency>
    <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-layout-template-json</artifactId>
      <version>2.17.1</version>
    </dependency>
    

    【讨论】:

      猜你喜欢
      • 2012-10-22
      • 1970-01-01
      • 2011-01-19
      • 1970-01-01
      • 2022-01-22
      • 1970-01-01
      • 2016-04-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多