【问题标题】:EclipseLink: How to set SLF4J logger for eclipselink 2.7.0EclipseLink:如何为 eclipselink 2.7.0 设置 SLF4J 记录器
【发布时间】:2017-08-26 02:17:33
【问题描述】:

Bundle org.eclipse.persistence.extension_2.7.0.qualifier.jar(我安装到 osgi 框架)包含类 org.eclipse.persistence.logging.slf4j.SLF4JLogger。在我的持久性文件中,我有

<property name="eclipselink.logging.logger" value="org.eclipse.persistence.logging.slf4j.SLF4JLogger"/>

但我明白了

Exception Description: ClassNotFound: [org.eclipse.persistence.logging.slf4j.SLF4JLogger] specified in [eclipselink.logging.logger] property.
Internal Exception: java.lang.ClassNotFoundException: org.eclipse.persistence.logging.slf4j.SLF4JLogger not found by org.eclipse.persistence.jpa [11]
    at org.eclipse.persistence.exceptions.EntityManagerSetupException.predeployFailed(EntityManagerSetupException.java:231)
    ... 36 more
Caused by: Exception [EclipseLink-28006] (Eclipse Persistence Services - 2.7.0.qualifier): org.eclipse.persistence.exceptions.EntityManagerSetupException
Exception Description: ClassNotFound: [org.eclipse.persistence.logging.slf4j.SLF4JLogger] specified in [eclipselink.logging.logger] property.
Internal Exception: java.lang.ClassNotFoundException: org.eclipse.persistence.logging.slf4j.SLF4JLogger not found by org.eclipse.persistence.jpa [11]
    at org.eclipse.persistence.exceptions.EntityManagerSetupException.classNotFoundForProperty(EntityManagerSetupException.java:135)
    at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.findClassForPropertyInternal(EntityManagerSetupImpl.java:1341)
    at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.findClassForProperty(EntityManagerSetupImpl.java:1327)
    at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.updateLoggers(EntityManagerSetupImpl.java:1202)
    at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.predeploy(EntityManagerSetupImpl.java:1752)
    ... 34 more
Caused by: java.lang.ClassNotFoundException: org.eclipse.persistence.logging.slf4j.SLF4JLogger not found by org.eclipse.persistence.jpa [11]
    at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1574)
    at org.apache.felix.framework.BundleWiringImpl.access$400(BundleWiringImpl.java:79)
    at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:2018)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:348)
    at org.eclipse.persistence.internal.security.PrivilegedAccessHelper.getClassForName(PrivilegedAccessHelper.java:165)
    at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.findClass(EntityManagerSetupImpl.java:1319)
    at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.findClassForPropertyInternal(EntityManagerSetupImpl.java:1337)
    ... 37 more

我已经检查了 bundle org.eclipse.persistence.extension_2.7.0.qualifier.jar doesn't export package org.eclipse.persistence.logging.slf4j 所以,谁能解释一下如何让 eclipselink 登录 slf4j?

【问题讨论】:

    标签: java jpa logging osgi eclipselink


    【解决方案1】:

    确保包含“org.eclipse.persistence.extension” jar,它应该可以正常工作。我使用的maven坐标是

      <dependency>
         <groupId>org.eclipse.persistence</groupId>
         <artifactId>org.eclipse.persistence.extension</artifactId>
         <version>2.7.2</version>
         <scope>runtime</scope>
      </dependency>
    

    【讨论】:

      【解决方案2】:

      由于提供包没有导出org.eclipse.persistence.logging.slf4j.SLF4JLogger,因此您必须通过创建一个扩展org.eclipse.persistence.logging.AbstractSessionLog 的记录器类并覆盖/实现一些方法,就像在原始org.eclipse.persistence.logging.slf4j.SLF4JLogger 中所做的那样,在您的代码中对其进行调整

      基本上它只是来自 EclipseLink 的原始记录器的副本。

      现在在创建 EntityManagerFactory 时传递给 PersistenceProvider 的 JPA 属性映射中添加 EclipseLink 日志记录类别和级别。

      Map<String, Object> properties = new HashMap<>();
      // Add the necessary logging category and level as per your requirement.
      properties.put("eclipselink.logging.level.connection", "FINE");
      properties.put("eclipselink.logging.level.jpa", "FINER");
      properties.put("eclipselink.logging.level.sql", "FINEST");
      // and so on for other categories which can be found in
      // org.eclipse.persistence.logging.SessionLog
      
      // Now put your logger class in persistence properties map so that EclipseLink use your logger instance.
      properties.put("eclipselink.logging.logger", <your logger>.class.getName());
      

      还要确保将以下具有您选择的级别的记录器添加到您的日志记录后端。

      例如,使用 Logback,声明将如下所示。

      <logger name="eclipselink.logging" level="DEBUG" additivity="false">
          <appender-ref ref="ROLLING_FILE"/>
      </logger>
      

      我正在从一个开源项目中添加一个 GitHub link,该项目已经改编了原始 org.eclipse.persistence.logging.slf4j.SLF4JLogger 的源代码

      希望这会有所帮助。

      【讨论】:

      • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
      • 这没有提供问题的答案。一旦你有足够的reputation,你就可以comment on any post;相反,provide answers that don't require clarification from the asker。 - From Review
      • @NKSM 我已经用足够的信息更新了我的答案。请看看您是否仍然认为它没有回答问题。如果它正在回答那么请删除downvote。
      • 任何其他审阅者都关心我提供的更新答案,IMO 现在完全解决了 OP 的问题。
      猜你喜欢
      • 2016-10-12
      • 2011-03-01
      • 1970-01-01
      • 2020-11-30
      • 2018-02-02
      • 2013-12-29
      • 1970-01-01
      • 2013-06-29
      相关资源
      最近更新 更多