Can't enable spring orm/transaction logging even when log4j.xml is configured

时间:2017-08-05 11:33:26

标签: spring-mvc logging orm log4j eclipselink

I have a configuration problem regarding enabling spring related logging in my application as I'm using EclipseLink,JPA 2.0 & Spring 4.0, I need to verify when the entity manager is closed or cleaned up while doing transactions.

My application is JTA enabled so everything is controlled by my container (Websphere).Here is my log4j.xml

<?xml version="1.0"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration debug="true" xmlns:log4j="http://jakarta.apache.org/log4j/">

    <!-- CONSOLE normally used in desktop environment -->
    <appender name="console" class="org.apache.log4j.ConsoleAppender">
        <param name="Encoding" value="UTF-8" />
        <param name="Threshold" value="DEBUG"/>
        <param name="Target" value="System.out" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d [%-8X{context}] %-5p %-40.40c{2} - %m%n"/>
        </layout> 
    </appender>

    <appender name="FILE_APPENDER" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="File" value="C:\\proj\\was\\logs\\spring.log"/>
        <param name="DatePattern" value="'-'yyyy-MM-dd'.txt'"/>
        <param name="Threshold" value="DEBUG"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} %-4p [%t] %C{2} - %m%n"/>
        </layout>
    </appender>


    <!-- Spring -->
    <logger name="org.springframework.transaction" additivity="false">
        <level value="DEBUG" />
        <appender-ref ref="FILE_APPENDER"/>
    </logger>

    <logger name="org.springframework.orm.jpa.EntityManagerFactoryUtils" additivity="false">
        <level value="DEBUG" />
        <appender-ref ref="FILE_APPENDER"/>
    </logger>

    <logger name="org.springframework.orm.jpa" additivity="false">
        <level value="DEBUG" />
        <appender-ref ref="FILE_APPENDER"/>
    </logger>



     <root>
        <level value="DEBUG" />
        <appender-ref ref="console" />
        <appender-ref ref="FILE_APPENDER" />
    </root> 

</log4j:configuration>

I have also tried many solutions like this, but it didn't help.Please help me where I'm going wrong?

3 个答案:

答案 0 :(得分:1)

从您的评论中,您似乎没有适配器slf4j到log4j。或者有另一个适配器。

要检查正在使用的适配器,请使用以下代码:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

    <item name="android:windowBackground">@drawable/background</item>

    <item>
        <bitmap android:gravity="center" android:src="@drawable/emblem"/>
    </item>

</layer-list>

如果不是log4j12适配器显示:

  • 检查战争,你应该在WEB-INF / lib中有一个slf4j-api-xxxx.jar。
  • 将slf4j-log4j12-xxxx.jar(相同版本)放入WEB-INF / lib
  • 如果有logback-xxxxx.jar将其删除,否则slf4j会将其记录下来
  • 如果有log4j-over-slf4j-xxxx.jar将其删除,否则log4j日志可能会被重定向到将重定向到log4j的slf4j,依此类推..
  • 可能需要删除另一个适配器(例如slf4j-jcl-xxxx.jar)。

答案 1 :(得分:0)

记录器层次结构

在大多数日志记录系统中,记录器具有父子关系,其中子级继承

  • 等级
  • 追加程序
  • ResourceBoudle

来自父亲记录器。并且根记录器存在于继承的顶部。子项将根据additivity将日志事件发送到父记录器。 False意味着它不会将日志发送到父记录器。

因此,从您的原始配置中,您没有允许与Spring相关的记录器将日志发送到您的根记录器。

建议

所以,现在我们知道我们应该将additivity设置为true并将log4j配置更改为如下所示:

<logger name="org.springframework.transaction" additivity="true"/>

<logger name="org.springframework.orm.jpa.EntityManagerFactoryUtils" additivity="true"/>

<logger name="org.springframework.orm.jpa" additivity="true"/>

 <root>
    <level value="DEBUG" />
    <appender-ref ref="console" />
    <appender-ref ref="FILE_APPENDER" />
</root> 

更多

  • Herehere是我写的关于slf4j&amp;的博文。 log4j&amp; Spring使用的logback,你可以阅读以增强对日志记录的理解;
  • 如果您更改additivity但仍无法看到登录控制台/文件,我建议您在EntityManagerFactoryUtils的任何日志记录行设置断点,然后单步执行代码查看什么错了;

更新

EntityManagerFactoryUtils的记录器,正如我们可以从源代码那样,不是slf4j或log4j。这是公共记录。所以关于这个类的log4j配置将不起作用。

import org.apache.commons.logging.Log;

private static final Log logger = LogFactory.getLog(EntityManagerFactoryUtils.class);

为了使您的配置有效,您应该制作一些bridge work

  • 从spring-orm中排除commons-logging.jar
  • 添加jcl-over-slf4j.jar
  • 确保您拥有slf4j-api & slf4j-log4j

答案 2 :(得分:0)

通过查看类路径上的Jars,可能需要进行一些清理,但为了做到这一点,我们需要了解每个罐子的作用。

<强>的log4j-1.2.9.jar 是Log4j的实现。这个是使用Log4j记录任何内容所必需的,当然还要读取log4j配置文件。

<强> slf4j.api-1.6.1.jar 是Slf4j API库,仅在您或您的某些第三方依赖项使用Slf4j进行日志记录时才需要,这很可能就像您已经在类路径中使用它一样。这允许您通过Slf4J API写入日志,例如:

private static final Logger LOG = org.slf4j.LoggerFactory.getLogger(MyLoggingClass.class);

<强> slf4j.jdk14-1.6.1.jar 是一个JDK 1.4,也称为Slf4j的java.util.logging绑定,用于在使用Slf4j时使用java.util.logging作为日志引擎。显然我们将使用log4j作为日志记录实现,而不是java.util.logging,这意味着应该删除它。

<强> SLF4J-log4j12-1.7.12.jar 是Slf4j的log4j 1.2绑定,需要将日志从Slf4j路由到Log4j实现。只有在需要 slf4j.api-1.6.1.jar 时才需要此项。但是,应该统一版本以避免冲突。

commons-logging-1.1.1.jar 和 的公地logging.jar 据我所知,这些都是公共记录框架。这是Spring使用的日志框架。但是,您应该只在类路径中使用其中一个,我建议使用显示它的版本的那个。

在类路径上使用正确的Jars,记录的公共应该能够为您选择正确的日志记录实现(在您的情况下是Log4j)。如果不是这种情况,请在类路径的根目录中明确放置名为 commons-logging.properties 的文件,并将以下行添加到其中:

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

强制它使用Log4j作为日志记录实现。