在Hibernate中开启日志

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 在Hibernate中开启日志 在项目中,如果要排查故障,找出Bug,离不开日志信息。那么在Hibernate项目中如何开启日志输出呢?本文讲述如何在Hibernate中开启日志,以及Hibernate的日志级别。
在Hibernate中开启日志

在项目中,如果要排查故障,找出Bug,离不开日志信息。那么在Hibernate项目中如何开启日志输出呢?本文讲述如何在Hibernate中开启日志,以及Hibernate的日志级别。

一、项目开发环境
具体以一个示例项目为例,我们的项目使用了:
1. Maven 3.2.3
http://maven.apache.org/
2. Hibernate 5.0.0.CR1 RELEASE
http://hibernate.org/orm/
3. Eclipse IDE,版本为Luna 4.4.1
http://www.eclipse.org/

二、依赖关系
示例项目使用了以下的开源库,包括:
1. hibernate-core
ORM持久化的核心库
2. mysql-connector-java
MySQL的JDBC驱动包
3. slf4j-api
供Hibernate使用的简单日志Facade
4. slf4j-log4j12
Hibernate使用的日志输出库
5. javassist
Hibernate使用的Java字节码操作库

Hibernate依赖于抽象日志框架SLF4J,使用SLF4J后,可以选择多种日志输出框架。如果项目未绑定任何日志输出框架,那么它是没有任何输出的。故本示例项目绑定了Log4j作为日志输出框架。

三、配置Log4j
在项目的类路径下,创建log4j.properties文件,内容如下:

点击(此处)折叠或打开

  1. # Root logger option
  2. log4j.rootLogger=INFO, console
  3. log4j.logger.com.ch.demo=INFO, console
  4.  
  5. # Direct log messages to console
  6. log4j.appender.console=org.apache.log4j.ConsoleAppender
  7. log4j.appender.console.Target=System.out
  8. log4j.appender.console.layout=org.apache.log4j.PatternLayout
  9. log4j.appender.console.layout.ConversionPattern=%d{HH:mm}| %p | %F %L | %m%n
  10.  
  11. # direct messages to file hibernate.log
  12. log4j.logger.org.hibernate=DEBUG, hibernate
  13. log4j.appender.hibernate=org.apache.log4j.RollingFileAppender
  14. log4j.appender.hibernate.File=hibernate.log
  15. log4j.appender.hibernate.layout=org.apache.log4j.PatternLayout
  16. log4j.appender.hibernate.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %5p %c{1}:%L - %m%n
上面的log4j.properties配置文件中,我们指定所有的Hibernate的具体信息输出类别为hibernate.log。它用于org.hibernate包。如果只想输出部分Hibernate类别的信息,那么需要对指定类别进行配置。

Hibernate主要的类别如下:
1)org.hibernate.SQL
日志输出所有Hibernate执行的SQL DML语句
2)org.hibernate.type
日志输出所有的JDBC参数
3)org.hibernate.transaction
日志输出所有活动相关的事务
4)org.hibernate.jdbc
日志输出所有的JDBC资源采集
5)org.hibernate.tool.hbm2ddl
日志输出所有Hibernate执行的SQL DDL语句
6)org.hibernate
日志输出所有的Hibernate信息

如果指定日志输出类别为org.hibernate.SQL,那么将会输出SQL语句。但是,还有一种更简单的查看SQL语句的方法,只需简单地设置show_sql参数为true。

四、Hibernate日志示例

1、创建实体Bean:Order

点击(此处)折叠或打开

  1. package com.ch.demo.hibernate;
  2.  
  3. import java.util.Date;
  4.  
  5. public class Order {
  6.     private Long orderId;
  7.     private String orderNbr;
  8.     private Date orderDate;
  9.     private String orderDesc;
  10.     private Long orderQty;
  11.  
  12.     public Order() {
  13.     }
  14.  
  15.     public Order(String orderNbr) {
  16.         this.orderNbr = orderNbr;
  17.     }
  18.  
  19.     public Long getOrderId() {
  20.         return orderId;
  21.     }
  22.  
  23.     private void setOrderId(Long orderId) {
  24.         this.orderId = orderId;
  25.     }
  26.  
  27.     public Date getOrderDate() {
  28.         return orderDate;
  29.     }
  30.  
  31.     public void setOrderDate(Date orderDate) {
  32.         this.orderDate = orderDate;
  33.     }
  34.  
  35.     public String getOrderDesc() {
  36.         return orderDesc;
  37.     }
  38.  
  39.     public void setOrderDesc(String orderDesc) {
  40.         this.orderDesc = orderDesc;
  41.     }
  42.  
  43.     public Long getOrderQty() {
  44.         return orderQty;
  45.     }
  46.  
  47.     public void setOrderQty(Long orderQty) {
  48.         this.orderQty = orderQty;
  49.     }
  50.  
  51.     public String toString() {
  52.         return "Order: nbr[" + orderNbr + "] date [" + orderDate + "] desc["
  53.                 + orderDesc + "] qty[" + orderQty + "]";
  54.     }
  55. }

2、创建ORM映射文件:orders.hbm.xml

点击(此处)折叠或打开

  1. !DOCTYPE hibernate-mapping
  2. PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  3. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  4. hibernate-mapping package="com.ch.demo.hibernate">
  5.     class name="com.ch.demo.hibernate.Order" table="orders">
  6.         id name="orderId" column="order_id">
  7.             generator class="native" />
  8.         /id>
  9.         property name="orderNbr" column="order_nbr" type="string" length="30" access="field"/>
  10.         property name="orderDesc" column="order_desc" type="string"
  11.             length="60" />
  12.         property name="orderDate" type="timestamp" column="order_date"/>
  13.         property name="orderQty" column="qty" type="long" />
  14.     /class>
  15. /hibernate-mapping>

3、操作数据库的示例代码:HibernateLoggingExample.java

点击(此处)折叠或打开

  1. package com.ch.demo.hibernate;
  2.  
  3. import java.io.IOException;
  4. import java.util.Date;
  5. import java.util.List;
  6.  
  7. import org.hibernate.MappingException;
  8. import org.hibernate.Query;
  9. import org.hibernate.Session;
  10. import org.hibernate.SessionFactory;
  11. import org.hibernate.Transaction;
  12. import org.hibernate.cfg.Configuration;
  13.  
  14. public class HibernateLoggingExample {
  15.  
  16.     public static void main(String[] args) throws MappingException, IOException {
  17.         Configuration configuration = new Configuration().configure();
  18.         SessionFactory sessionFactory = configuration.buildSessionFactory();
  19.         Session session = sessionFactory.getCurrentSession();
  20.         Transaction tx = session.getTransaction();
  21.         tx.begin();
  22.         Query query = session.createQuery("from Order where orderNbr='ORD01'");
  23.         List list = query.list();
  24.         System.out.println("Orders found: " + list.size());
  25.         for(Order order: list) {
  26.             session.delete(order);
  27.             System.out.println("Deleted " + order);
  28.         }
  29.         tx.commit();
  30.          
  31.         session = sessionFactory.getCurrentSession();
  32.         tx = session.getTransaction();
  33.         tx.begin();
  34.         Order order = new Order("ORD01");
  35.         order.setOrderDesc("Laptop");
  36.         order.setOrderQty(2L);
  37.         order.setOrderDate(new Date());
  38.         session.save(order);
  39.         tx.commit();
  40.          
  41.         session = sessionFactory.getCurrentSession();
  42.         tx = session.getTransaction();
  43.         tx.begin();
  44.         query = session.createQuery("from Order where orderNbr='ORD01'");
  45.         System.out.println("List all orders: " + query.list());
  46.         tx.commit();
  47.          
  48.         sessionFactory.close();
  49.     }
  50. }

4、日志输出

点击(此处)折叠或打开

  1. 19:14| DEBUG | IntegratorServiceImpl.java 46 | Adding Integrator [org.hibernate.cfg.beanvalidation.BeanValidationIntegrator].
  2. 19:14| DEBUG | IntegratorServiceImpl.java 46 | Adding Integrator [org.hibernate.secure.spi.JaccIntegrator].
  3. 19:14| DEBUG | IntegratorServiceImpl.java 46 | Adding Integrator [org.hibernate.cache.internal.CollectionCacheInvalidator].
  4. ...
  5. 19:14| DEBUG | LocalXmlResourceResolver.java 74 | Recognized legacy hibernate-mapping identifier; attempting to resolve on classpath under org/hibernate/
  6. 19:14| DEBUG | MappingBinder.java 53 | Performing JAXB binding of hbm.xml document : Origin(name=orders.hbm.xml,type=RESOURCE)
  7. 19:14| DEBUG | BasicTypeRegistry.java 130 | Adding type registration boolean -> org.hibernate.type.BooleanType@55f616cf
  8. 19:14| DEBUG | BasicTypeRegistry.java 130 | Adding type registration boolean -> org.hibernate.type.BooleanType@55f616cf
  9. 19:14| DEBUG | BasicTypeRegistry.java 130 | Adding type registration java.lang.Boolean -> org.hibernate.type.BooleanType@55f616cf
  10. ...
  11. 19:14| DEBUG | ErrorCounter.java 95 | throwQueryException() : no errors
  12. 19:14| DEBUG | QueryTranslatorImpl.java 246 | HQL: from com.ch.demo.hibernate.Order where orderNbr='ORD01'
  13. 19:14| DEBUG | QueryTranslatorImpl.java 247 | SQL: select order0_.order_id as order_id1_0_, order0_.order_nbr as order_nb2_0_, order0_.order_desc as order_de3_0_, order0_.order_date as order_da4_0_, order0_.qty as qty5_0_ from orders order0_ where order0_.order_nbr='ORD01'
  14. 19:14| DEBUG | ErrorCounter.java 95 | throwQueryException() : no errors
  15. ...
  16. 19:14| DEBUG | SqlStatementLogger.java 92 | delete from orders where order_id=?
  17. Hibernate: delete from orders where order_id=?
  18. ...
  19. 19:14| DEBUG | SqlStatementLogger.java 92 | insert into orders (order_nbr, order_desc, order_date, qty) values (?, ?, ?, ?)
  20. Hibernate: insert into orders (order_nbr, order_desc, order_date, qty) values (?, ?, ?, ?)

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
3月前
|
SQL 数据库 Java
Hibernate 日志记录竟藏着这些秘密?快来一探究竟,解锁调试与监控最佳实践
【8月更文挑战第31天】在软件开发中,日志记录对调试和监控至关重要。使用持久化框架 Hibernate 时,合理配置日志可帮助理解其内部机制并优化性能。首先,需选择合适的日志框架,如 Log4j 或 Logback,并配置日志级别;理解 Hibernate 的多级日志,如 DEBUG 和 ERROR,以适应不同开发阶段需求;利用 Hibernate 统计功能监测数据库交互情况;记录自定义日志以跟踪业务逻辑;定期审查和清理日志避免占用过多磁盘空间。综上,有效日志记录能显著提升 Hibernate 应用的性能和稳定性。
49 0
|
3月前
|
SQL 缓存 Java
如何在 Hibernate 中启用 SQL 日志记录?
【8月更文挑战第21天】
118 0
|
Java 数据库连接
Hibernate添加日志--log4j
需要导入 slf4j-log4j12-1.6.2.jar slf4j-api-1.6.2.jar log4j-1.2.16.jar 三个jar文件 编写properties文件,建议将日志输出级别设置为warn级别
811 0
|
Java 数据库连接 数据格式
Hibernate使用Log4j日志记录
日常我们调试程序的时候都是打印日志,但是使用日志记录能够将日志详细信息永久写入文件,更加方便我们查阅,在hibernate框架中使用 Log4j和Logback框架来支持日志记录。
1266 0
|
SQL Java 数据库连接
在Hibernate中开启日志
版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。 https://blog.csdn.net/chszs/article/details/46482297 在Hibernate中开启日志 作者:chszs,转载需注明。
741 0
|
6月前
|
SQL 缓存 Java
框架分析(9)-Hibernate
框架分析(9)-Hibernate
|
16天前
|
缓存 Java 数据库连接
Hibernate:Java持久层框架的高效应用
通过上述步骤,可以在Java项目中高效应用Hibernate框架,实现对关系数据库的透明持久化管理。Hibernate提供的强大功能和灵活配置,使得开发者能够专注于业务逻辑的实现,而不必过多关注底层数据库操作。
10 1