【问题标题】:Can't enable spring orm/transaction logging even when log4j.xml is configured即使配置了 log4j.xml,也无法启用 spring orm/transaction 日志记录
【发布时间】:2017-08-15 16:59:22
【问题描述】:

我在使用 EclipseLink、JPA 2.0 和 Spring 4.0 时在我的应用程序中启用与 spring 相关的日志记录存在配置问题,我需要验证实体管理器何时关闭或在执行事务时清理。

我的应用程序启用了 JTA,所以一切都由我的容器(Websphere)控制。这是我的 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>

我也尝试了许多解决方案,例如this,但没有帮助。请帮助我哪里出错了?

【问题讨论】:

  • 您的问题到底是什么?你没有任何日志?你有丢失的日志吗?当心,spring 使用 slf4j,所以你需要 slf4j-log4j12 jar 才能在 log4j 上记录内容
  • @wargre 我需要将 spring 内部 logger.debug() 日志启用到我的控制台或我已配置 log4j.xml 并具有必要的 jar 的文件,但它仍然不会打印日志。我会尝试你对 slf4j-log4j12 jar 的建议,但我应该下载哪个版本的 jar?

标签: spring-mvc logging orm log4j eclipselink


【解决方案1】:

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

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

StaticLoggerBinder binder = StaticLoggerBinder.getSingleton();
System.out.println(binder.getLoggerFactoryClassStr());

如果不是log4j12适配器显示:

  • 查看war,WEB-INF/lib中应该有一个slf4j-api-xxxx.jar。
  • 将slf4j-log4j12-xxxx.jar(同版本)放入WEB-INF/lib中
  • 如果有 logback-xxxxx.jar 将其删除,否则 slf4j 会将其带入日志
  • 如果有 log4j-over-slf4j-xxxx.jar 将其删除,否则 log4j 日志可能会被重定向到 slf4j,而 slf4j 将重定向到 log4j 等等..
  • 可能还有另一个适配器(例如 slf4j-jcl-xxxx.jar)需要移除。

【讨论】:

  • 我的 lib 文件夹中有以下 jars 用于记录 log4j-1.2.9.jar slf4j.api-1.6.1.jar slf4j.jdk14-1.6.1.jar slf4j-log4j12-1.7.12 .jar commons-logging.jar commons-logging-1.1.1.jar ----------仍然无法打印日志,我错了
  • 删除 slf4j.jdk14-1.6.1.jar 和 slf4j-log4j12-1.7.12.jar。放 slf4j-log4j12-1.6.1.jar (slf4j 需要相同版本).
  • 你能把这段代码放在StaticLoggerBinder binder = StaticLoggerBinder.getSingleton(); System.out.println(binder.getLoggerFactoryClassStr()); (或将字符串放在您知道可以读取的位置)在您的应用程序中,以便我们可以确定 slf4j 使用的记录器是什么?
  • 我试过那个代码,它打印的是“org.slf4j.impl.JDK14LoggerFactory”
  • 表示 slf4j.jdk14-1.6.1.jar jar 还在。一种或另一种方式。所以使用 JDK 日志而不是 log4j。
【解决方案2】:

记录器层次结构

在大多数日志系统中,logger都有父子关系,子继承关系

  • 等级
  • 附加器
  • 资源包

来自父亲记录器。并且根记录器存在于继承的顶部。孩子将根据additivity 将日志事件发送给父亲记录器。 False 表示它不会向父 lo​​gger 发送日志。

因此,从您的原始配置中,您不允许 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 是我写的关于 Spring 使用的 slf4j & log4j & 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 &amp; slf4j-log4j

【讨论】:

  • 进入Jdk14Logger 1.2版本方法 public void debug(Object message) { log(Level.FINE, String.valueOf(message), null); } 仍然无法打印日志
  • 我没有使用 maven 及其使用 ant 构建的遗留应用程序,那么如何实现第一步?从 spring-orm 中排除 commons-logging.jar
  • 好吧,我没用过ant,你试试this linkthis problem
【解决方案3】:

通过查看类路径中的 Jars,可能需要进行一些清理,但为了做到这一点,我们需要了解每个 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,也称为 java.util.logging 的 Slf4j 绑定,用于在使用 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.jarcommons-logging.jar 据我所知,这些都是公共日志框架。这是 Spring 使用的日志记录框架。但是,您的类路径中应该只有其中一个,我建议使用显示其版本的那个。

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

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

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

【讨论】:

  • org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4jLogger add this throws me class not found exception 即使 jars 存在于我的库中
  • 您在哪个版本的 WebSphere 上运行?您能否确认您使用的是足够新以支持 Log4j 1.2 的 commons-logging 版本,例如 1.1.1 版本?使用 JVM 选项 -verbose:class 可以通过启用类加载器日志记录来验证正在使用的公共日志记录
  • IBM Websphere 8.5.5.8 是的,我有 1.1.1 版本
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-27
  • 2013-03-23
相关资源
最近更新 更多