【问题标题】:Integrate Spring with Log4j2将 Spring 与 Log4j2 集成
【发布时间】:2016-02-04 23:01:03
【问题描述】:

我想 Spring 使用 Log4j2 进行日志记录,因为有时我想获得调试级别。我已经阅读了大量相关主题和示例,但没有任何效果。我设法配置 log4j2 并从我自己的课程中登录,但不是从 spring 中。 我得到了什么:
Maven 依赖:

    <dependencies>
    <!-- SERVLT API -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.0.1</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>3.8.1</version>
        <scope>test</scope>
    </dependency>

    <!-- APACHE TILES -->
    <dependency>
        <groupId>org.apache.tiles</groupId>
        <artifactId>tiles-extras</artifactId>
        <version>3.0.5</version>
    </dependency>

    <!-- APACHE FILEUPLOAD -->
    <dependency>
        <groupId>commons-fileupload</groupId>
        <artifactId>commons-fileupload</artifactId>
        <version>1.3.1</version>
    </dependency>

    <!-- Spring and Transactions -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>${spring-framework.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-tx</artifactId>
        <version>${spring-framework.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>${spring-framework.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>${spring-framework.version}</version>
    </dependency>

    <!-- Spring ORM support -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-orm</artifactId>
        <version>${spring-framework.version}</version>
    </dependency>

    <!-- SPRING SECURITY -->
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-web</artifactId>
        <version>${spring-framework.version}</version>
    </dependency>

    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-config</artifactId>
        <version>${spring-framework.version}</version>
    </dependency>

    <!-- LOGGING -->

    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <version>${logger.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-api</artifactId>
        <version>${logger.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-1.2-api</artifactId>
        <version>${logger.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-slf4j-impl</artifactId>
        <version>${logger.version}</version>
    </dependency>


    <!-- Hibernate -->
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-entitymanager</artifactId>
        <version>${hibernate.version}</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>${hibernate.version}</version>
    </dependency>

    <!-- POSTGRE DRIVER -->
    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <version>9.4.1207.jre7</version>
    </dependency>
    <dependency>
        <groupId>commons-dbcp</groupId>
        <artifactId>commons-dbcp</artifactId>
        <version>1.4</version>
    </dependency>

    <!-- JACKSON -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.7.0</version>
    </dependency>

</dependencies>

log4j.xml:(编辑:文件名是 log4j2.xml - 抱歉有错误)

<Configuration status="debug">
<Appenders>
    <RollingFile name="systemLog" fileName="C:\\test\logs\system.log" includeLocation="true"
                filePattern="C:\\test\logs\system-%d{MM-dd-yyyy}-%i.log.gz">
        <PatternLayout pattern="%d{ISO8601} - %-5level [%t] %C %M %m%n" />
        <Policies>
            <TimeBasedTriggeringPolicy />
            <SizeBasedTriggeringPolicy size="15 MB"/>
        </Policies>
    </RollingFile>
    <Async name="systemAsyncAppender" includeLocation="true">
        <AppenderRef ref="systemLog" />
    </Async>
</Appenders>
<Loggers>
    <Logger name="org.springframework.web" level="debug">
        <AppenderRef ref="systemAsyncAppender" />
    </Logger>
    <Root level="debug" includeLocation="true">
        <AppenderRef ref="systemAsyncAppender" />
    </Root>
</Loggers>

如果有什么相关的事情我没有告诉 - 告诉我

如果能帮我解决这个问题,我会非常高兴

【问题讨论】:

  • 我在您的 pom.xml 文件中没有看到任何 log4j2 依赖项。
  • 1.我相信 Log4J 2 的配置文件是 log4j2.xml 2。你不需要 Log4J2 来获得调试级别。几乎任何 SLF4j 绑定都可以做到
  • @AshraffAliWahab org.apache.logging.log4j:log4j-* 实际上是 log4j2 的神器
  • @Adrian Shum - 你是对的,我在帖子中犯了一个错误。该文件是 log4j2.xml,我知道它是正确的。你能链接到一些配置 SLF4j 的例子吗?我并没有真正依赖 log4j2,所以我对其他日志框架持开放态度。
  • @TomaszSkaba 您找到解决方案了吗?我遇到了同样的问题。我尝试过将 commons-logging 与 jcl 桥或 slf4j 与它的桥一起使用,但 spring 仍然没有记录。尽管如此,在这两种配置中,我都设法在应用程序中创建了我的日志,并且休眠日志正常工作。

标签: java spring maven spring-mvc log4j2


【解决方案1】:
<!-- Log4j Configuration -->
<bean id="log4jInitializer" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
    <property name="staticMethod">
        <value>org.springframework.util.Log4jConfigurer.initLogging</value>
    </property>
    <property name="arguments">
        <list>
            <value>${path.to.log4j.file}</value>
        </list>
    </property>
</bean>

在你的 spring 上下文文件中添加这个

【讨论】:

  • 我认为这是配置 log4j 而不是 log4j2 的方式。我收到错误:错误 DOM 元素是 - 不是 元素。
【解决方案2】:

我相信 Spring 使用公共日志记录,因此您需要公共日志记录 jar 和 log4j-jcl jar。

【讨论】:

  • 不,slf4j 提供的模拟公共日志记录的 shim 就可以了。
  • 这会将公共日志路由到 slf4j,然后再到 log4j。最好使用commons logging,使用log4j的bridge。
【解决方案3】:

如果有人正在使用 Spring 5 并来到这篇文章,请注意,如 initial Spring 5 documentation 中所述(或更简单地在 current version 中解释):

  • 不再需要像 JCL-over-SLF4J 这样的外部桥接器,相应地也不需要从 spring-core 依赖项中手动排除标准 Commons Logging jar。
  • 只需将 Log4j 2.x 或 SLF4J 放在您的类路径中,无需任何额外的桥接 jar,或者通过 JUL 依赖默认日志记录(使用可自定义的 JUL 设置)。

即对于Log4j 2,将其依赖添加到您的pom.xml 如下:

<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.14.1</version>
</dependency>
  • 从 Spring 5 开始,从现有的 spring-core 依赖项设置中删除对外部 Commons Logging 网桥的任何引用以及对标准 Commons Logging jar 的任何手动排除。您的 Log4j 或 SLF4J 或 JUL 设置将继续工作而无需更改。请注意,您可能仍需要排除其他库(例如 Apache HttpClient、Castor、HtmlUnit)的 commons-logging exclude 来代替 Spring 的 JCL 桥。

作为如何使用 Log4j2 的提醒:

在您的 java 代码中

根据Apache Log4j 2 documentation

    import org.apache.logging.log4j.LogManager;
    import org.apache.logging.log4j.Logger;
     
    public class HelloWorld {
        private static final Logger logger = LogManager.getLogger("HelloWorld");
        public static void main(String[] args) {
            logger.info("Hello, World!");
        }
    }

/src/main/resources中的配置文件

您需要log4j2 配置文件,格式为xmljsonyaml

Log4j 2 reference documentation中的详细信息和示例

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-23
    • 2011-02-18
    • 2012-08-24
    • 2020-08-31
    • 1970-01-01
    • 2012-10-20
    • 1970-01-01
    • 2016-03-11
    相关资源
    最近更新 更多