启用Hibernate日志记录

26

我正在尝试创建Hibernate语句日志记录。 我使用JPA执行我的SQL语句,其中Hibernate 2.0是持久性提供程序(我的应用服务器是JBoss AS 6.0)。 我使用EJB 3.0提供的EntityManager接口调用CRUD方法。 我读了很多关于启用Hibernate日志记录的帖子,但实际上我看不到任何日志 :-( 我创建了一个log4j.properties文件,并将其放在我的Netbeans项目的根文件夹中。 我还将log4j库放在项目的类路径中。 我的log4j.properties如下:

### direct log messages to stdout ###
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=%d{ABSOLUTE} %5p %c{1}:%L – %m%n


log4j.rootLogger=debug, stdout

log4j.logger.org.hibernate=info

 ### log just the SQL
log4j.logger.org.hibernate.SQL=debug

### log JDBC bind parameters ###
log4j.logger.org.hibernate.type=info

### log schema export/update ###
log4j.logger.org.hibernate.tool.hbm2ddl=info

### log HQL parse trees
#log4j.logger.org.hibernate.hql=debug

### log cache activity ###
log4j.logger.org.hibernate.cache=info

### log transaction activity
#log4j.logger.org.hibernate.transaction=debug

### log JDBC resource acquisition
#log4j.logger.org.hibernate.jdbc=debug

为什么我看不到日志信息? 我想在SQL语句的where子句或插入语句中看到值(实际上我只看到一些“?”) 提前致谢。

为了清晰起见,我在下面放置了我的项目文件夹结构:

MyProject
¦   build.xml
¦   log4j.properties
¦
+---build
¦   ¦   capitolo2-ejb.jar
¦   ¦   capitolo2-war.war
¦   ¦   JBoss4.dpf
¦   ¦
¦   +---lib
¦   ¦       log4j-1.2.15.jar
¦   ¦       slf4j-api.jar
¦   ¦       slf4j-jboss-logmanager.jar
¦   ¦
¦   +---META-INF
¦           chapter2-hornetq-jms.xml
¦           jboss-app.xml
¦           log4j.properties
¦           MANIFEST.MF
¦
+---capitolo2-ejb
¦   ¦   build.xml
¦   ¦   
¦   ¦
¦   +---build
¦   ¦   +---classes
¦   ¦   ¦   ¦   .netbeans_automatic_build
¦   ¦   ¦   ¦   .netbeans_update_resources
¦   ¦   ¦   ¦
¦   ¦   ¦   +---ejb
¦   ¦   ¦   ¦   +---com
¦   ¦   ¦   ¦       +---ejb3inaction
¦   ¦   ¦   ¦           +---actionbazaar
¦   ¦   ¦   ¦               +---buslogic
¦   ¦   ¦   ¦               ¦       BillingException.class
¦   ¦   ¦   ¦               ¦       OrderBillingMDB.class
¦   ¦   ¦   ¦               ¦       PlaceBid.class
¦   ¦   ¦   ¦               ¦       PlaceBidBean.class
¦   ¦   ¦   ¦               ¦       PlaceOrder.class
¦   ¦   ¦   ¦               ¦       PlaceOrderBean.class
¦   ¦   ¦   ¦               ¦
¦   ¦   ¦   ¦               +---persistence
¦   ¦   ¦   ¦                       Bid.class
¦   ¦   ¦   ¦                       BillingInfo.class
¦   ¦   ¦   ¦                       Order.class
¦   ¦   ¦   ¦                       OrderStatus.class
¦   ¦   ¦   ¦                       ShippingInfo.class
¦   ¦   ¦   ¦
¦   ¦   ¦   +---META-INF
¦   ¦   ¦           beans.xml
¦   ¦   ¦           jboss.xml
¦   ¦   ¦           MANIFEST.MF
¦   ¦   ¦           persistence.xml
¦   ¦   ¦
¦   ¦   +---empty
¦   ¦   +---generated-sources
¦   ¦       +---ap-source-output
¦   +---dist
¦   ¦       capitolo2-ejb.jar
¦   ¦
¦   +---lib
¦   ¦       log4j-1.2.15.jar
¦   ¦
¦   +---nbproject
¦   ¦   ¦   ant-deploy.xml
¦   ¦   ¦   build-impl.xml
¦   ¦   ¦   genfiles.properties
¦   ¦   ¦   project.properties
¦   ¦   ¦   project.xml
¦   ¦   ¦
¦   ¦   +---private
¦   ¦           private.properties
¦   ¦           private.xml
¦   ¦
¦   +---setup
¦   ¦       jboss-ds.xml
¦   ¦
¦   +---src
¦       +---conf
¦       ¦       beans.xml
¦       ¦       jboss.xml
¦       ¦       MANIFEST.MF
¦       ¦       persistence.xml
¦       ¦
¦       +---java
¦           +---ejb
¦               +---com
¦                   +---ejb3inaction
¦                       +---actionbazaar
¦                           +---buslogic
¦                           ¦       BillingException.java
¦                           ¦       OrderBillingMDB.java
¦                           ¦       PlaceBid.java
¦                           ¦       PlaceBidBean.java
¦                           ¦       PlaceOrder.java
¦                           ¦       PlaceOrderBean.java
¦                           ¦
¦                           +---persistence
¦                                   Bid.java
¦                                   BillingInfo.java
¦                                   Order.java
¦                                   OrderStatus.java
¦                                   ShippingInfo.java
¦
+---capitolo2-war
¦   ¦   build.xml
¦   ¦
¦   +---build
¦   ¦   +---empty
¦   ¦   +---generated-sources
¦   ¦   ¦   +---ap-source-output
¦   ¦   +---lib
¦   ¦   ¦       log4j-1.2.15.jar
¦   ¦   ¦       slf4j-api.jar
¦   ¦   ¦       slf4j-jboss-logmanager.jar
¦   ¦   ¦
¦   ¦   +---web
¦   ¦       ¦   index.jsp
¦   ¦       ¦
¦   ¦       +---META-INF
¦   ¦       ¦       MANIFEST.MF
¦   ¦       ¦
¦   ¦       +---WEB-INF
¦   ¦           ¦   beans.xml
¦   ¦           ¦   jboss-web.xml
¦   ¦           ¦
¦   ¦           +---classes
¦   ¦               ¦   .netbeans_automatic_build
¦   ¦               ¦   .netbeans_update_resources
¦   ¦               ¦
¦   ¦               +---it
¦   ¦                   +---myservlets
¦   ¦                           PlaceBidServlet.class
¦   ¦                           PlaceOrderServlet.class
¦   ¦
¦   +---dist
¦   ¦       capitolo2-war.war
¦   ¦
¦   +---nbproject
¦   ¦   ¦   ant-deploy.xml
¦   ¦   ¦   build-impl.xml
¦   ¦   ¦   genfiles.properties
¦   ¦   ¦   project.properties
¦   ¦   ¦   project.xml
¦   ¦   ¦
¦   ¦   +---private
¦   ¦           private.properties
¦   ¦           private.xml
¦   ¦
¦   +---setup
¦   ¦       jboss-ds.xml
¦   ¦
¦   +---src
¦   ¦   +---conf
¦   ¦   ¦       MANIFEST.MF
¦   ¦   ¦
¦   ¦   +---java
¦   ¦       +---it
¦   ¦           +---myservlets
¦   ¦                   PlaceBidServlet.java
¦   ¦                   PlaceOrderServlet.java
¦   ¦
¦   +---web
¦       ¦   index.jsp
¦       ¦
¦       +---WEB-INF
¦               beans.xml
¦               jboss-web.xml
¦
+---dist
¦       capitolo2.ear
¦
+---nbproject
¦   ¦   ant-deploy.xml
¦   ¦   build-impl.xml
¦   ¦   genfiles.properties
¦   ¦   project.properties
¦   ¦   project.xml
¦   ¦
¦   +---private
¦           private.properties
¦
+---setup
¦       jboss-ds.xml
¦       jboss4-netbeans-destinations-service.xml
¦       log4j.properties
¦
+---src
    +---conf
            chapter2-hornetq-jms.xml
            jboss-app.xml
            log4j.properties
            MANIFEST.MF

log4j.properties文件应该在应用程序运行时的类路径根目录下,但似乎并不存在。 - JB Nizet
我不明白。我应该把它放在哪个文件夹结构中?谢谢 - Rosanero4Ever
我不知道你如何构建和运行你的类。在运行时,它应该位于您的jar文件的根目录中。 - JB Nizet
你认为这个错误只是由于log4j.properties文件位置不正确引起的吗? - Rosanero4Ever
不,我不确定。但如果它不在任何类路径中,肯定不会起作用。 - JB Nizet
正如我下面所写的,log4j.properties在类路径中。 - Rosanero4Ever
5个回答

40

在Hibernate配置文件中还需要启用Hibernate日志记录。

添加以下行

hibernate.show_sql=true
hibernate.format_sql=true

无论是要

server\default\deployers\ejb3.deployer\META-INF\jpa-deployers-jboss-beans.xml

或者将信息写入应用程序中的 persistence.xml 文件中的 <persistence-unit><properties> 标签。

无论如何,Hibernate 日志记录不会以有用的形式包含实际准备好的语句参数的信息。

还有一种使用log4jdbc记录任何类型SQL日志的替代方法。

上述答案假设您在JBoss上运行使用Hibernate的代码,而不是在IDE中运行。 在这种情况下,您应该在服务器\default\deploy\jboss-logging.xml上配置日志记录,而不是在本地IDE类路径上。

请注意,JBoss 6默认不使用log4j。因此,将log4j.properties添加到ear中是无效的。 只需尝试添加到jboss-logging.xml中:

   <logger category="org.hibernate">
     <level name="DEBUG"/>
   </logger>

然后改变根记录器的阈值。请参见SLF4J logger.debug() does not get logged in JBoss 6

如果您成功地从IDE(无需部署)调试Hibernate查询,则应将log4j.properties、log4j、slf4j-api和slf4j-log4j12 JAR文件放在类路径上。 请参见http://www.mkyong.com/hibernate/how-to-configure-log4j-in-hibernate-project/


我在类路径中有这些JAR文件,并且我从NetBeans运行我的代码。我添加了hibernate.format_sql = true,但仍然不起作用 :-( 我会阅读一些关于jboss-logging.xml的内容。 - Rosanero4Ever
我怀疑你在NetBeans中运行代码。IDE只是帮助你构建EAR以便在JBoss上部署。应用程序代码实际上在应用服务器上运行,它对IDE、配置或项目文件结构一无所知,它仅根据EAR的内容和自身的设置来执行操作。请注意,JBoss 6默认不使用log4j。因此,将log4j.properties添加到EAR中是没有帮助的。继续查看jboss-logging.xml。 - Vadzim
我已经更新了答案,并提供了更改jboss-logging.xml的提示。 - Vadzim
我看到了这些标签,但我相信它们有助于限制日志的冗长。在这种情况下,我应该只看到“调试”信息,但我仍然什么都没有看到:( - Rosanero4Ever
请参考以下内容,解决在 JBoss 6 中使用 SLF4J 记录器时无法记录 debug 级别日志的问题。 - Vadzim
显示剩余3条评论

8

我来回答这个问题。根据Vadzim的建议,我需要考虑jboss-logging.xml文件并插入以下代码:

<logger category="org.hibernate">
     <level name="TRACE"/>
</logger>

我将DEBUG级别改为TRACE。 现在不仅要查看控制台,还需要打开server.log文件(调试消息不会发送到控制台,但您可以配置此模式!)。


Tomcat的等效文件是什么? - Ram

4

Spring Boot,v2.3.0.RELEASE

推荐(在application.properties中):

logging.level.org.hibernate.SQL=DEBUG //logs all SQL DML statements
logging.level.org.hibernate.type=TRACE //logs all JDBC parameters 

参数

注意:
上述方法不会使你的内容变得漂亮。
你可以将其作为一个配置项添加:

properties.put("hibernate.format_sql", "true");

或者按照下面的方式。

可行但不建议

spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true

原因:最好让日志框架为您管理/优化输出,而且它不会给您准备好的语句参数。

干杯


1
这样做更有意义。 - Felipe Desiderati

1

你的 log4j.properties 文件应该在 capitolo2.ear 的根目录下(而不是 META-INF 目录下),即:

MyProject
¦   build.xml
¦   
+---build
¦   ¦   capitolo2-ejb.jar
¦   ¦   capitolo2-war.war
¦   ¦   JBoss4.dpf
¦   ¦   log4j.properties

请验证任何 log4j.properties 是否在您的类路径中。这不应为 null(在 Servlet 或 EJB bean 中进行测试)this.getClass().getClassLoader().getResourceAsStream("log4j.properties") - Nulldevice
log4j在我的类路径中。我写了以下代码:InputStream resourceAsStream = null; resourceAsStream = this.getClass().getClassLoader().getResourceAsStream("log4j.properties"); if (resourceAsStream != null) out.println("log4j正常"); 运行结果为 "log4j正常"。 - Rosanero4Ever

0

我们有一个运行在AlpineLinux中的docker上的tomcat-8.5 + restlet-2.3.4 + hibernate-4.2.0 + log4j-1.2.14 java 8应用程序。

在将这两行添加到/usr/local/tomcat/webapps/ROOT/WEB-INF/classes/log4j.properties后,我开始在日志中看到HQL查询:

### log just the SQL
log4j.logger.org.hibernate.SQL=debug

### log JDBC bind parameters ###
log4j.logger.org.hibernate.type=debug

然而,JDBC绑定参数没有被记录。


如果您想在日志中看到绑定参数,您应该设置log4j.logger.org.hibernate.type=trace - mmesnjak

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