EclipseLink:如何为EclipseLink 2.7.0设置SLF4J记录器

3

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,发现它没有导出 org.eclipse.persistence.logging.slf4j 包。所以,请问有人能够解释如何让EclipseLink在slf4j中进行日志记录吗?

2个回答

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>

-1

由于提供方捆绑包未导出org.eclipse.persistence.logging.slf4j.SLF4JLogger,您需要通过创建一个扩展org.eclipse.persistence.logging.AbstractSessionLog的记录器类并覆盖/实现一些方法来在代码中进行适应,就像在原始的org.eclipse.persistence.logging.slf4j.SLF4JLogger中所做的一样。

基本上,它只是从EclipseLink中复制的原始记录器。

现在在传递给PersistenceProvider创建EntityManagerFactory的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源代码进行了适配。

希望这可以帮到你。


这并没有回答问题。一旦您拥有足够的声望,您将能够评论任何帖子;相反,提供不需要询问者澄清的答案。- 来自审核 - NKSM
@NKSM 我已经更新了我的答案并提供了足够的信息。请查看是否仍然认为它没有回答问题。如果它回答了问题,请取消踩赞。 - Rakesh
有其他审阅者愿意查看我提供的更新答案吗?在我看来,这现在完全解决了原帖作者的问题。 - Rakesh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接