在Hibernate中開啟日誌
在Hibernate中開啟日誌
作者:chszs,轉載需註明。部落格主頁:http://blog.csdn.net/chszs
在專案中,如果要排查故障,找出Bug,離不開日誌資訊。那麼在Hibernate專案中如何開啟日誌輸出呢?本文講述如何在Hibernate中開啟日誌,以及Hibernate的日誌級別。
一、專案開發環境
具體以一個示例專案為例,我們的專案使用了:
- Maven 3.2.3
http://maven.apache.org/ - Hibernate 5.0.0.CR1 RELEASE
http://hibernate.org/orm/ - 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檔案,內容如下:
# Root logger option
log4j.rootLogger=INFO, console
log4j.logger.com.ch.demo=INFO, console
# Direct log messages to console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.Target=System.out
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{HH:mm}| %p | %F %L | %m%n
# direct messages to file hibernate.log
log4j.logger.org.hibernate=DEBUG, hibernate
log4j.appender.hibernate=org.apache.log4j.RollingFileAppender
log4j.appender.hibernate.File=hibernate.log
log4j.appender.hibernate.layout=org.apache.log4j.PatternLayout
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
package com.ch.demo.hibernate;
import java.util.Date;
public class Order {
private Long orderId;
private String orderNbr;
private Date orderDate;
private String orderDesc;
private Long orderQty;
public Order() {
}
public Order(String orderNbr) {
this.orderNbr = orderNbr;
}
public Long getOrderId() {
return orderId;
}
private void setOrderId(Long orderId) {
this.orderId = orderId;
}
public Date getOrderDate() {
return orderDate;
}
public void setOrderDate(Date orderDate) {
this.orderDate = orderDate;
}
public String getOrderDesc() {
return orderDesc;
}
public void setOrderDesc(String orderDesc) {
this.orderDesc = orderDesc;
}
public Long getOrderQty() {
return orderQty;
}
public void setOrderQty(Long orderQty) {
this.orderQty = orderQty;
}
public String toString() {
return "Order: nbr[" + orderNbr + "] date [" + orderDate + "] desc["
+ orderDesc + "] qty[" + orderQty + "]";
}
}
2、建立ORM對映檔案:orders.hbm.xml
<!DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.ch.demo.hibernate">
<class name="com.ch.demo.hibernate.Order" table="orders">
<id name="orderId" column="order_id">
<generator class="native" />
</id>
<property name="orderNbr" column="order_nbr" type="string" length="30" access="field"/>
<property name="orderDesc" column="order_desc" type="string"
length="60" />
<property name="orderDate" type="timestamp" column="order_date"/>
<property name="orderQty" column="qty" type="long" />
</class>
</hibernate-mapping>
3、運算元據庫的示例程式碼:HibernateLoggingExample.java
package com.ch.demo.hibernate;
import java.io.IOException;
import java.util.Date;
import java.util.List;
import org.hibernate.MappingException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
public class HibernateLoggingExample {
public static void main(String[] args) throws MappingException, IOException {
Configuration configuration = new Configuration().configure();
SessionFactory sessionFactory = configuration.buildSessionFactory();
Session session = sessionFactory.getCurrentSession();
Transaction tx = session.getTransaction();
tx.begin();
Query query = session.createQuery("from Order where orderNbr=`ORD01`");
List list = query.list();
System.out.println("Orders found: " + list.size());
for(Order order: list) {
session.delete(order);
System.out.println("Deleted " + order);
}
tx.commit();
session = sessionFactory.getCurrentSession();
tx = session.getTransaction();
tx.begin();
Order order = new Order("ORD01");
order.setOrderDesc("Laptop");
order.setOrderQty(2L);
order.setOrderDate(new Date());
session.save(order);
tx.commit();
session = sessionFactory.getCurrentSession();
tx = session.getTransaction();
tx.begin();
query = session.createQuery("from Order where orderNbr=`ORD01`");
System.out.println("List all orders: " + query.list());
tx.commit();
sessionFactory.close();
}
}
4、日誌輸出
19:14| DEBUG | IntegratorServiceImpl.java 46 | Adding Integrator [org.hibernate.cfg.beanvalidation.BeanValidationIntegrator].
19:14| DEBUG | IntegratorServiceImpl.java 46 | Adding Integrator [org.hibernate.secure.spi.JaccIntegrator].
19:14| DEBUG | IntegratorServiceImpl.java 46 | Adding Integrator [org.hibernate.cache.internal.CollectionCacheInvalidator].
...
19:14| DEBUG | LocalXmlResourceResolver.java 74 | Recognized legacy hibernate-mapping identifier; attempting to resolve on classpath under org/hibernate/
19:14| DEBUG | MappingBinder.java 53 | Performing JAXB binding of hbm.xml document : Origin(name=orders.hbm.xml,type=RESOURCE)
19:14| DEBUG | BasicTypeRegistry.java 130 | Adding type registration boolean -> org.hibernate.type.BooleanType@55f616cf
19:14| DEBUG | BasicTypeRegistry.java 130 | Adding type registration boolean -> org.hibernate.type.BooleanType@55f616cf
19:14| DEBUG | BasicTypeRegistry.java 130 | Adding type registration java.lang.Boolean -> org.hibernate.type.BooleanType@55f616cf
...
19:14| DEBUG | ErrorCounter.java 95 | throwQueryException() : no errors
19:14| DEBUG | QueryTranslatorImpl.java 246 | HQL: from com.ch.demo.hibernate.Order where orderNbr=`ORD01`
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`
19:14| DEBUG | ErrorCounter.java 95 | throwQueryException() : no errors
...
19:14| DEBUG | SqlStatementLogger.java 92 | delete from orders where order_id=?
Hibernate: delete from orders where order_id=?
...
19:14| DEBUG | SqlStatementLogger.java 92 | insert into orders (order_nbr, order_desc, order_date, qty) values (?, ?, ?, ?)
Hibernate: insert into orders (order_nbr, order_desc, order_date, qty) values (?, ?, ?, ?)
相關文章
- 如何啟用Hibernate慢查詢日誌? -Vlad Mihalcea
- mysql開啟慢日誌MySql
- 如何在MySQL中開啟慢查詢日誌?MySql
- Ubuntu 下開啟 crontab日誌Ubuntu
- PostgreSQL-開啟PG日誌(六)SQL
- 慢查詢日誌開啟分析
- 開啟PHP的錯誤log日誌PHP
- mysql 開啟和關閉日誌記錄MySql
- 在Linux中,如何檢視系統日誌?Linux
- 中繼日誌中繼
- 在Linux中,有哪些系統日誌檔案?Linux
- 在Linux中,有哪些日誌管理和分析工具?Linux
- Spark歷史日誌伺服器開啟及配置Spark伺服器
- 在Linux中,如何使用logrotate命令管理日誌檔案?Linuxlogrotate
- 程式中的日誌
- 開學日誌5
- 開學日誌4
- 開學日誌3
- Avalonia開發日誌
- 開發日誌5
- 開發日誌8
- 開發日誌7
- 開發日誌10
- 開發日誌9
- lumen cli日誌和普通日誌分開儲存
- Innodb: 自動開啟列印show engine status到err日誌
- 在Linux中,有一堆日誌檔案,如何刪除7天前的日誌檔案?Linux
- 在Linux中,如何使用ELK進行日誌管理和分析?Linux
- 在Linux中,如何管理和最佳化日誌檔案?Linux
- 使用 logzero 在 Python 中進行簡單日誌記錄Python
- 在Hibernate中關於Oracle sequence的使用KHOracle
- 在python程式碼 出力log日誌Python
- 在SpringBoot中使用Logback管理日誌Spring Boot
- Logtail從入門到精通(二):開啟日誌採集之旅AI
- FLOWERS開發日誌(一)
- FLOWERS開發日誌(二)
- FLOWERS開發日誌(三)
- 在Linux中,日誌檔案通常儲存在哪些目錄?Linux
- 定時將系統時間更新在日誌檔案中