将 log4j 与 hibernate 和 glassfish 3.0.1 一起使用

Posted

技术标签:

【中文标题】将 log4j 与 hibernate 和 glassfish 3.0.1 一起使用【英文标题】:using log4j with hibernate and glassfish 3.0.1 【发布时间】:2011-03-28 13:53:34 【问题描述】:

我正在尝试在 glassfish 3.0.1 上使用 JPA 设置休眠 3.5.3;

我正在使用 netbeans 6.9.1 企业项目;我添加了所有必需的休眠文件,一切都很好,除了日志记录......

我添加到项目类路径中,就像文档中所说的(仅列出与日志相关的 jar):

-slf4j-api-1.5.8.jar

-slf4j-log4j12-1.5.8.jar

-log4j-1.2.16.jar

-log4j.properties 看起来像:

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%dABSOLUTE %5p %c1:%L - %m%n

log4j.rootLogger=info, stdout

log4j.logger.org.hibernate.test=info
log4j.logger.org.hibernate.tool.hbm2ddl=debug

我还使用-Dlog4j.debug JVM 属性激活了调试。

我一部署就在服务器日志中看到:

SEVERE: log4j:ERROR A "org.apache.log4j.ConsoleAppender" object is not assignable to a "org.apache.log4j.Appender" variable.
SEVERE: log4j:ERROR The class "org.apache.log4j.Appender" was loaded by 
SEVERE: log4j:ERROR [EarLibClassLoader : 
urlSet = [URLEntry : file:/C:/Users/Bogdan/Documents/NetBeansProjects/GwtCms/dist/gfdeploy/GwtCms/lib/antlr-2.7.6.jar, URLEntry : file:/C:/Users/Bogdan/Documents/NetBeansProjects/GwtCms/dist/gfdeploy/GwtCms/lib/commons-collections-3.1.jar, URLEntry : file:/C:/Users/Bogdan/Documents/NetBeansProjects/GwtCms/dist/gfdeploy/GwtCms/lib/dom4j-1.6.1.jar, URLEntry : file:/C:/Users/Bogdan/Documents/NetBeansProjects/GwtCms/dist/gfdeploy/GwtCms/lib/gwt-servlet.jar, URLEntry : file:/C:/Users/Bogdan/Documents/NetBeansProjects/GwtCms/dist/gfdeploy/GwtCms/lib/hibernate-jpa-2.0-api-1.0.0.Final.jar, URLEntry : file:/C:/Users/Bogdan/Documents/NetBeansProjects/GwtCms/dist/gfdeploy/GwtCms/lib/hibernate3.jar, URLEntry : file:/C:/Users/Bogdan/Documents/NetBeansProjects/GwtCms/dist/gfdeploy/GwtCms/lib/javassist-3.9.0.GA.jar, URLEntry : file:/C:/Users/Bogdan/Documents/NetBeansProjects/GwtCms/dist/gfdeploy/GwtCms/lib/jta-1.1.jar, URLEntry : file:/C:/Users/Bogdan/Documents/NetBeansProjects/GwtCms/dist/gfdeploy/GwtCms/lib/log4j-1.2.16.jar, URLEntry : file:/C:/Users/Bogdan/Documents/NetBeansProjects/GwtCms/dist/gfdeploy/GwtCms/lib/slf4j-api-1.5.8.jar, URLEntry : file:/C:/Users/Bogdan/Documents/NetBeansProjects/GwtCms/dist/gfdeploy/GwtCms/lib/slf4j-log4j12-1.5.8.jar]
doneCalled = false 
 Parent -> org.glassfish.internal.api.DelegatingClassLoader@10ab6fa
] whereas object of type 
SEVERE: log4j:ERROR "org.apache.log4j.ConsoleAppender" was loaded by [EarLibClassLoader : 
urlSet = [URLEntry : file:/C:/Users/Bogdan/Documents/NetBeansProjects/GwtCms/dist/gfdeploy/GwtCms/lib/antlr-2.7.6.jar, URLEntry : file:/C:/Users/Bogdan/Documents/NetBeansProjects/GwtCms/dist/gfdeploy/GwtCms/lib/commons-collections-3.1.jar, URLEntry : file:/C:/Users/Bogdan/Documents/NetBeansProjects/GwtCms/dist/gfdeploy/GwtCms/lib/dom4j-1.6.1.jar, URLEntry : file:/C:/Users/Bogdan/Documents/NetBeansProjects/GwtCms/dist/gfdeploy/GwtCms/lib/gwt-servlet.jar, URLEntry : file:/C:/Users/Bogdan/Documents/NetBeansProjects/GwtCms/dist/gfdeploy/GwtCms/lib/hibernate-jpa-2.0-api-1.0.0.Final.jar, URLEntry : file:/C:/Users/Bogdan/Documents/NetBeansProjects/GwtCms/dist/gfdeploy/GwtCms/lib/hibernate3.jar, URLEntry : file:/C:/Users/Bogdan/Documents/NetBeansProjects/GwtCms/dist/gfdeploy/GwtCms/lib/javassist-3.9.0.GA.jar, URLEntry : file:/C:/Users/Bogdan/Documents/NetBeansProjects/GwtCms/dist/gfdeploy/GwtCms/lib/jta-1.1.jar, URLEntry : file:/C:/Users/Bogdan/Documents/NetBeansProjects/GwtCms/dist/gfdeploy/GwtCms/lib/log4j-1.2.16.jar, URLEntry : file:/C:/Users/Bogdan/Documents/NetBeansProjects/GwtCms/dist/gfdeploy/GwtCms/lib/slf4j-api-1.5.8.jar, URLEntry : file:/C:/Users/Bogdan/Documents/NetBeansProjects/GwtCms/dist/gfdeploy/GwtCms/lib/slf4j-log4j12-1.5.8.jar]
doneCalled = false 
 Parent -> org.glassfish.internal.api.DelegatingClassLoader@91cd46
].
SEVERE: log4j:ERROR Could not instantiate appender named "stdout".
SEVERE: log4j:WARN No appenders could be found for logger (org.hibernate.cfg.annotations.Version).
SEVERE: log4j:WARN Please initialize the log4j system properly.
SEVERE: log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

关于如何解决此问题的任何想法?谢谢!

编辑

我尝试按照 Tushar Tarkas 的建议从我的项目中删除 log4j:

SEVERE: org/apache/log4j/Level
java.lang.NoClassDefFoundError: org/apache/log4j/Level
        at org.slf4j.LoggerFactory.getSingleton(LoggerFactory.java:223)
        at org.slf4j.LoggerFactory.bind(LoggerFactory.java:120)
        at org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:111)
        at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:269)

EDIT2:解决方案

我不知道为什么,但是如果我将 log4j-1.2.16.jar 文件复制到 /domains/domain1/lib 中,它就可以工作了。

EDIT3:

Pascal,这就是 GF 的部署。

EnterpriseApplication1-ejb_jar >
    .netbeans_automatic_build
    .netbeans_update_resources
    ejbs // classes for EJB
    entities // classes for entities
    log4j.properties
    META-INF
EnterpriseApplication1-war_war >
    index.jsp
    META-INF
    WEB-INF
META-INF
lib >
    antlr-2.7.6.jar
    commons-collections-3.1.jar
    dom4j-1.6.1.jar
    hibernate-jpa-2.0-api-1.0.0.Final.jar
    hibernate3.jar
    javassist-3.9.0.GA.jar
    jta-1.1.jar
    log4j-1.2.16.jar
    slf4j-api-1.5.8.jar
    slf4j-log4j12-1.5.8.jar

【问题讨论】:

删除 log4j.jar 肯定不是解决方案。但我想知道你是如何包装它的。 反正我写了一篇关于设置Hibernate + GF + NB的教程。我仍然对使 log4j 与 GF3 一起工作的更好方法感兴趣。教程可以在这里找到:bogdantanaseit.blogspot.com/2010/08/… 【参考方案1】:

我可以找到一些与类似问题相关的讨论。问题在于 glassfish 版本 3 及更高版本。这些类似乎是由不同的类加载器加载的。

检查this。

【讨论】:

感谢您的意见。我已经查看了该讨论,但他们似乎没有达成解决方案。知道我是否可以在 glassfish 或 log4j 中设置“某些东西”来解决这个问题? 尝试从您的应用程序 lib 目录中删除 log4j 的 jar 文件。 GlassFish 已经拥有它在内部使用的 log4j。 如果有 2 个不同版本的 log4js,可能会出现这个问题。看到这个(webdeveloper.com/forum/archive/index.php/t-77688.html)【参考方案2】:

尝试通过 Glassfish 使用特定于应用程序的类加载。

将 log4j.jar 放入 [Glassfish-Install-Dir].[PATH-TO-DOMAIN]/lib/applibs. 您还可以创建一个新目录以保持干净: [Glassfish-Install-Dir].[PATH-TO-DOMAIN]/lib/applibs/MY_APPLICATIONS_DEPENDENCIES

完成后,您必须在部署应用程序时指定加载 log4j。 有两种选择: 1.管理控制台/Web界面:在选项库中填写log4j的信息 2. 使用带有 ----libraries 选项的 asadmin deploy 命令并指定逗号分隔的路径。有关详细信息,请参阅 Oracle GlassFish Server 3.1-3.1.1 参考手册。 (引自 Oracle GlassFish Server 3.1 应用开发指南)

【讨论】:

您不再使用您的应用程序部署 log4j.jar。

以上是关于将 log4j 与 hibernate 和 glassfish 3.0.1 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

如何将Hibernate生成的SQL语句打印到日志文件

Spring Boot Webapp:让 Hibernate 使用 log4j

如何将Hibernate生成的SQL语句打印到日志文件

使用 Log4j XML 配置文件配置 Hibernate 日志记录?

struts2,spring,hibernate,log4j,quartz 公司使用这些组件和框架开发项目,需要付费吗?

怎样把hibernate产生的SQL语句,输出到log4j文件