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

博客分类:
正在做的项目使用了hibernate,但hibernate的SQL一直只输出到console,并没有写到日志文件
项目使用的是log4j,调了log4j.properties也不起效,后来在hibernate官网发现一条说明:Hibernate utilizes Simple Logging Facade for Java (SLF4J) in order to log various system events.&
这才恍然大悟,原来我们的web server启动起来一直报
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
没有去理会,原来hibernate是用slf4j来做日志的facade,加上slf4j的依赖包后重启server就搞定了。
build.gradle的配置:
slf4j = ["org.slf4j:slf4j-log4j12:1.6.1"]
compile = &jar...&,slf4j
log4j.properties的配置:
log4j.logger.org.hibernate.SQL=DEBUG,3rdPartyAppender
log4j.additivity.org.hibernate=false
重启之后提示,hibernate.SQL日志能正常显示
SLF4J: Found binding in [jar:file:/C:/Users/maxeric/.gradle/cache/org.slf4j/slf4j-log4j12/jars/slf4j-log4j12-1.6.1.jar!/org/slf4j/impl/StaticLoggerBinder.class]
浏览: 14189 次
来自: 深圳
能放得下吗
人家写的好东西,采毛啊顶起
懂太多的人拖出去杀了
你懂得太多了。。。
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'博客分类:
Jboss中使用Log4J输出Hibernate所生成的SQL中的参数值
&&打开Jboss中配置LOG的配置文件:{JBOSS_HOME}\server\mycis\conf\jboss-log4j.xml,更改其中的Threshold的值为TRACE.目的是让Jboss能输出TRACE级别的日志.
&!-- ============================== --&
&!-- Append messages to the console --&
&!-- ============================== --&
&appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender"&
&errorHandler class="org.jboss.logging.util.OnlyOnceErrorHandler"/&
&param name="Target" value="System.out"/&
&param name="Threshold" value="TRACE"/&
&layout class="org.apache.log4j.PatternLayout"&
&param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%c] %m%n"/&
&/appender&
&&添加Hibernate日志限制,以便输出Hibernate所生成的SQL中的参数值的Java文件能输出Trace级别的日志,同时还要保证其它的都能继续使用原来的INFO或者DEBUG级别(不然会打印出很多日志的,不方便观察得分析).
&!-- ================ --&
&!-- Limit categories --&
&!-- ================ --&
&category name="org.jboss.web"&
&priority value="INFO" /&
&/category&
&category name="org.jboss.ha"&
&priority value="INFO" /&
&/category&
&category name="com.arjuna"&
&priority value="INFO" /&
&/category&
&category name="org.hibernate"&
&priority value="INFO" /&
&/category&
&category name="org.hibernate.type"&
&priority value="TRACE" /&
&/category&
&&对于普通非WEB的应用,可以直接调整项目里的LOG4J配置文件,如下:
log4j.properties
log4j.rootLogger=INFO,stdout
#默认下让Hibernate输出INFO级别的LOG
log4j.logger.org.hibernate=INFO
#对参数值的输出时,使用TRACE级别来输出
log4j.logger.org.hibernate.type=TRACE
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:%L - %m%n
浏览: 243717 次
来自: 成都
不要让生活太糟糕 写道我在MyEclipse2015上试了一下 ...
我在MyEclipse2015上试了一下,没用。
还真是,这个问题困扰我很长时间了。
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'匿名用户不能发表回复!|Hibernate&与log4j、Slf4J日志参数控制
显示出Hibernate查询语句的绑定参数值
在使用 Hibernate
进行数据库操作的时候可以显示出所执行的 SQL
语句,相信用 Hibernate
的兄弟姐妹们都知道怎么设置。就设置 hibernate.show_sql&
或者 show_sql
属性为 true
就行,在hibernate.cfg.xml
或者与 Spring
集成时配置在 Spring
的配置文件中。再就是要让显示的 SQL
语句是格式化的,就配置 hibernate.format_sql
或是 format_sql
为 true,否则总在一行中执行。Hibernate
显示的 SQL
语句好像是通过 System.out.println()
直接输出的。
大部份时候是通过PreparedStatement
来执行 SQL
语句的,它的好处是可预处理、被缓存,可防止注入。只是这样让 Hibernate
执行的 SQL
语句输出到控制台是带问号的,如:
Hibernate:
formtempla0_.id as id6_,
formtempla0_.name as name6_,
formtempla0_.title as title6_,
formtempla0_.finish_message as finish4_6_,
formtempla0_.promotion_code as promotion5_6_
footnotedpro.form_templates formtempla0_
formtempla0_.name=?
我们有时候很想知道此时绑定给这个
?号具体是什么值,但默认情况下在日志中是没有显示出来的,因为输出它的 LEVEL
级别是 TRACE,而我们用
开发时默认级别一般最低也是 DEBUG,也就是要为这一输出指定日志的
为 TRACE。
针对我所用的 Hibernate 3.6.0,如果是用
输出日志就在 log4j.properties(log4j.xml
log4j.logger.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
如果用的是 Slf4J + Logback
的话,就在 logback.xml
name="org.hibernate.type.descriptor.sql.BasicBinder"
level="TRACE"/&
有了这个 TRACE
配置,在输出上面 SQL
语句后还会显示出每个参数所绑定的值,如:
00:41:03.262 [http-8080-1] TRACE
org.hibernate.type.descriptor.sql.BasicBinder - binding parameter
[1] as [VARCHAR] - gt
第一个参数绑定的值是 VARCHAR
类型的 "gt",如果有更多的参数依次显示下去。
如果 Hibernate
的版本不是 3.6.0
话,可能配置略有不同,有些文章介绍说把下面两个包的 TRACE
打开,即:
log4j.logger.org.hibernate.type=TRACE
log4j.logger.org.hibernate.sql=TRACE
中的配置请参照上面。这时候你不仅看到了查询前的绑定值,连查询出来的每一个字段值都有了:
00:56:50.474 [http-8080-2] TRACE
org.hibernate.type.descriptor.sql.BasicExtractor - found [7] as
column [id6_]
00:56:50.505 [http-8080-2] TRACE
org.hibernate.type.descriptor.sql.BasicExtractor - found [gt] as
column [name6_]
00:56:50.505 [http-8080-2] TRACE
org.hibernate.type.descriptor.sql.BasicExtractor - found [Learn
more] as column [title6_]
00:56:50.505 [http-8080-2] TRACE
org.hibernate.type.descriptor.sql.BasicExtractor - found [Thank
you.] as column [finish4_6_]
00:56:50.990 [http-8080-2] TRACE
org.hibernate.type.descriptor.sql.BasicExtractor - found [] as
column [promotion5_6_]
还有更冗余的 Hibernate
初始化的信息,所以你应该在 org.hibernate.type
和 org.hibernate.sql
这两个包的 TRACE
基础上,观察日志输出来紧缩要 TRACE
显示Hibernate的sql语句参数值
&&&&&&&&&&&&
在控制台中显示Hibernate打印的SQL中的参数
=============================================================================================
灵活控制 Hibernate 的日志或 SQL 输出,以便于诊断
我们在使用 Hibernate 时一般只会关注是否显示生成的 SQL 语句,不过有些时候还不够。默认时 Hibernate
执行的 SQL 语句是打印在控制台上的,它也可以配置为输出给 Log4J 或是
Log4Back,还能显示出更详细的参数和取值信息。这里简单讲来。
Hibernate 的配置文件 hibernate.cfg.xml 里提供有三个有关显示 SQL 的配置项,如果是与
Spring 联合,也可以配置到 Spring 的配置中。它们的取值是 boolean 值。
1) hibernate.show_sql - 是否显示所生成 SQL 语句,我们最常和它打交道
2) hibernate.format_sql - 是否格式化生成的 SQL 语句,增加可读性,不然全挤在一行
3) hibernate.use_sql_comments - 是否显示注释,用以指出什么操作产生的 SQL
语句,相比上面两条而言,这个配置会稍稍陌生些
来看看加了上面三条配置后产生的效果,执行了 Hibernate 查询后,在控制台上产生如下输出:
Hibernate:
securities0_.post_id as post1_7_1_,
security1_.shareclassid as sharecla1_16_0_,
security1_.company_id as company2_16_0_,
Post_Security_Relationship securities0_
unmi.securities security1_
&&&&&&&&&&&
on securities0_.shareclassid=security1_.shareclassid
securities0_.post_id=?
hibernate.show_sql 控制全局是否显示生成的 SQL 语句,hibernate.format_sql
格式化后的效果如上,不然就是一行,而 hibernate.use_sql_comments 输出的是红色的部分,表明是在加哉
securities 集合时所执行的 SQL 语句。
Hibernate 默认是把 SQL
语句是输出到控制台,而控制台中的内容查阅起来并不方便,例如超过控制台缓存的内容会被清掉,不是谁都能看到控制台,难以与时间关联起来。虽然有些应用服务器会把控制台输出重定向到文件,但总没有
Log4J 或 Slf4J 那样的专业日志工具来得便捷。
因为 Hibernate 在输出 SQL 时使用的 logger 名为 org.hibernate.SQL, 所以想要让 SQL
语句输出到 Log4J 或是 Slf4J 日志中(日志文件或是记在别处,由 Appender 决定的),只要在
log4j.properties(log4j.xml 参考相应配置) 中加上:
log4j.logger.org.hibernate.SQL=DEBUG
记得同时把 Hibernate 配置文件中(或者 Spring 中关于 Hibernate 的配置中) 的
hibernate.show_sql 设置为 false,不然可能在控制台下会有双份输出(Log4J 配置了
ConsoleAppender 时)。
如果就用的是 Log4Back 的话,就在 Log4Back 的配置文件 log4back.xml 中加上:
&logger name="org.hibernate.SQL"
level="DEBUG"/&
这时的日志输出格式与控制台下没多少分别,只是跟着 Log4J 或 Slf4J 跑而已,像:
20:13:40.757 [http-8080-1] DEBUG org.hibernate.SQL -
&&& select
tags0_.post_id as post1_7_1_,
tags0_.tag_id as tag2_1_,
elementite1_.id as id3_0_,
Post_Tag_Relationship tags0_
unmi.element_item elementite1_
&&&&&&&&&&&
on tags0_.tag_id=elementite1_.id
tags0_.post_id=?
只有红色部分不同,应用上了 Log4J 或 Slf4J 的配置了,可以看到执行的时间、线程等相关信息。
我们想知道前面输出的 SQL 语句中的 ? 参数代表的实际值是什么,还需要打开一个日志
org.hibernate.type.descriptor.sql.BasicBinder 的输出级别为 TRACE,这里同时把
org.hibernate.type.descriptor.sql.BasicExtractor 的输出级别也设置为
TRACE,来看看效果:
log4j.properties 中配置为:
log4j.logger.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
loggerorg.hibernate.type.descriptor.sql.BasicExtractor=TRACE
logback.xml 中配置为:
name="org.hibernate.type.descriptor.sql.BasicBinder"
level="TRACE"/&
name="org.hibernate.type.descriptor.sql.BasicExtractor"
level="TRACE"/&
之后看输出:
20:13:40.710 [http-8080-1] DEBUG org.hibernate.SQL -
&&& select
categories0_.post_id as post1_7_1_,
elementite1_.id as id3_0_,
Post_Category_Relationship categories0_
unmi.element_item elementite1_
&&&&&&&&&&&
on categories0_.category_id=elementite1_.id
categories0_.post_id=?
20:13:40.710 [http-8080-1] TRACE
org.hibernate.type.descriptor.sql.BasicBinder - binding parameter
[1] as [INTEGER] - 10
20:13:40.710 [http-8080-1] TRACE
org.hibernate.type.descriptor.sql.BasicExtractor - found [1002] as
column [id3_0_]
20:13:40.710 [http-8080-1] TRACE
org.hibernate.type.descriptor.sql.BasicExtractor - found [10] as
column [post1_7_1_]
红色部分是 org.hibernate.type.descriptor.sql.BasicBinder=TRACE
控制的,显示了绑定给 SQL 的参数列表。蓝色部分是
org.hibernate.type.descriptor.sql.BasicExtractor=TRACE
控制的,显示了查询后记录的字段值。注意这两个属性是要设置到 TRACE 级别,所以在一般日志的全局 DEBUG
级别之下,它们会表示不受影响。
有时候想要显示查询中命名参数的值,用 :email 而不是 ? 的形式,则还需要引入两个
log4j.logger.org.hibernate.engine.QueryParameters=DEBUG
log4j.logger.org.hibernate.engine.query.HQLQueryPlan=DEBUG
效果是这样的:
20:13:40.710 [http-8080-1]
org.hibernate.engine.query.HQLQueryPlan - find: from User where
email = :email
20:13:40.710 [http-8080-1] org.hibernate.engine.QueryParameters -
named parameters: }
20:13:40.726 [http-8080-1] org.hibernate.SQL -
&&& select
user0_.id as id0_,
user0_.email as email0_,
user0_.enabled as enabled0_,
user0_.encodedPassword as encodedP8_0_
User user0_
user0_.email=?
对上面综合一下,比较好的配置可以参考:
hibernate.cfg.xml 中配置:
name="hibernate.show_sql"&false&/property&
name="hibernate.format_sql"&true&/property&
name="hibernate.use_sql_comments"&true&/property&
或者是在 Spring 中关于 Hibernate 的配置属性:
key="hibernate.show_sql"&false&/prop&
key="hibernate.format_sql"&true&/prop&
key="hibernate.use_sql_comments"&true&/prop&
而在日志配置中,如 log4j.properties 中配置:
log4j.logger.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
log4j.logger.org.hibernate.type.descriptor.sql.BasicExtractor=TRACE
log4j.logger.org.hibernate.SQL=DEBUG
log4j.logger.org.hibernate.engine.QueryParameters=DEBUG
log4j.logger.org.hibernate.engine.query.HQLQueryPlan=DEBUG
倘若用的是 Slf4J 话,就在 logback.xml 中配置:
name="org.hibernate.type.descriptor.sql.BasicBinder"
level="TRACE"/&
name="org.hibernate.type.descriptor.sql.BasicExtractor"
level="TRACE"/&
name="org.hibernate.SQL"
level="DEBUG"/&
name="org.hibernate.engine.QueryParameters"
level="DEBUG"/&
name="org.hibernate.engine.query.HQLQueryPlan"
level="DEBUG"/&
如果你会觉得日志太多的话,反正我是会这么觉得,那么可考虑把
org.hibernate.type.descriptor.sql.BasicExtractor 设置为
DEBUG,或不设置该配置项。
注: 本文是在 Hibernate 3.6.0 Final 下做的测试,如果是用的其他版本的 Hibernate,尤其是
Hibernate 2.x 可能配置很不相象了,需斟酌应对。
本文链接 , 来自
==================================================================================================
1.spring的配置文件中增加:
&prop key="hibernate.show_sql"&true&/prop&
或者在hibernate的配置文件中增加:
&property name="show_sql"&true&/property&
2.在log4j.properties中做如下配置:
log4j.appender.STDOUT.Threshold=trace
log4j.category.org.hibernate.SQL=trace
log4j.category.org.hibernate.type=trace
控制台显示如下:
Hibernate: insert into app_log (time, usr, ip, level, log) values (?, ?, ?, ?, ?)
log4j:org.hibernate.type.NullableType.nullSafeSet(NullableType.java:133)# - binding ' 14:36:48' to parameter: 1
log4j:org.hibernate.type.NullableType.nullSafeSet(NullableType.java:133)# - binding '1' to parameter: 2
log4j:org.hibernate.type.NullableType.nullSafeSet(NullableType.java:133)# - binding '127.0.0.1' to parameter: 3
log4j:org.hibernate.type.NullableType.nullSafeSet(NullableType.java:133)# - binding 'info' to parameter: 4
log4j:org.hibernate.type.NullableType.nullSafeSet(NullableType.java:133)# - binding 'admin login '
=====================================================================================
通过对log4j.properties的配置来完成:
log4j.rootLogger=warn,console
log4j.logger.org.hibernate.type=debug,console
log4j.logger.org.hibernate.sql=debug,console
=================================================
log4j.appender.STDOUT.Threshold=trace
log4j.category.org.hibernate.SQL=trace
log4j.category.org.hibernate.type=trace
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%p][%d{yyyy-MM-dd
HH:mm:ss}][%t]-%m%n
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。16:53 提问
log4j没办法 输出hibernate的sql到日志文件~~~~~~
我的log4j.properties配置
log4j.debug=false
log4j.path.iacportal=./iacportal/
log4j.logger.org.hibernate.SQL=DEBUG
log4j.logger.org.hibernate.type=TRACE
log4j.logger.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
#INFO級別日志输出
log4j.rootLogger=INFO,A1
log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=[%-5p][%d{yyyy-MM-dd HH:mm:ss,SSSS}]
log4j.appender.A1.file=${log4j.path.iacportal}/log4j_app-INFO_V100.log
#log4j.appender.A1.threshold=INFO
log4j.appender.A1.DatePattern='-'yyyy-MM-dd
反正我是什么级别的日志都输出了就是没有sql输出,不知道还有没有其他什么可以影响日志输出 求大神帮助
按赞数排序
没人啊,最后我使用了p6spy 把日志输出来了
~~~~~~~~~~
这个&property name="show_sql"&true&/property&
hibernate的sql输出到控制台的话应该是在hibernate里面配置false吧
&bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"&
&property name="dataSource"&
&ref bean="dataSource" /&
&/property&
&property name="hibernateProperties"&
&!-- 方言 --&
&prop key="hibernate.dialect"&
org.hibernate.dialect.Oracle10gDialect
&!-- 是否显示SQL语句 --&
&prop key="hibernate.show_sql"&true&/prop&
&!-- 是否格式化SQL语句 --&
&prop key="hibernate.format_sql"&true&/prop&
&/property&
&property name="mappingResources"&
&value&cn/bdqn/entity/User.hbm.xml&/value&
&/property&
没人了么 我总感觉和这各有关系
16:30:04,450-[TS] DEBUG main org.springframework.aop.framework.Cglib2AopProxy - Unable to apply any optimisations to advised method: public void ins.framework.dao.GenericDaoHibernate.update(java.io.Serializable)
这是我日志文件中输出的日志信息
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐

我要回帖

更多关于 log4j sql语句输出 的文章

 

随机推荐