将log4j属性文件包含在hibernate中,以显示带有值的查询而不是问号。

17

我已经创建了如下所示的log4j.properties文件:

log4j.logger.org.hibernate=INFO, hb
log4j.logger.org.hibernate.SQL=DEBUG
log4j.logger.org.hibernate.type=TRACE
log4j.logger.org.hibernate.hql.ast.AST=info
log4j.logger.org.hibernate.tool.hbm2ddl=warn
log4j.logger.org.hibernate.hql=debug
log4j.logger.org.hibernate.cache=info
log4j.logger.org.hibernate.jdbc=debug

log4j.appender.hb=org.apache.log4j.ConsoleAppender
log4j.appender.hb.layout=org.apache.log4j.PatternLayout
log4j.appender.hb.layout.ConversionPattern=HibernateLog --> %d{HH:mm:ss} %-5p %c - %m%n
log4j.appender.hb.Threshold=TRACE

有人可以帮我学习如何将它包含在hibernate.cfg.xml文件中吗?对不起,我其实不知道log4j是如何工作的。我创建了这个来使用value而不是?显示我的Hibernate查询,但仍然显示?,没有任何变化,那我需要怎么继续?

我从这里参考:Hibernate show real SQL


1
将log4j.properties文件放置在类路径中,Hibernate将自动获取它。请确保您提供所需的jar文件。 - Abhijith Nagarajan
我已经将其放置在默认的 src 文件夹中,并且它在 classpath 中,但是我没有看到任何效果。 - commit
你能确保在类路径(classpath)中有log4j.properties文件吗?对我而言它是有效的。下面是我的项目结构:src/main/java --> Java类 src/main/resources --> log4j.properties虽然这是一个Maven项目结构,但我正在使用普通的Eclipse构建(项目-->构建项目)来构建我的类。 - Abhijith Nagarajan
1
你使用的是哪个版本的Hibernate?Hibernate 3.5使用SLF4j API,该API默认使用logback而不是log4j。如果你的classpath中有logback,请将其删除并添加slf4j-log4j12.jar和log4j.jar。 - GeertPt
8个回答

14

您的hibernate.cfg.xml文件中的'show_sql'属性会导致查询直接打印到控制台。

Log4j允许将输出记录在各种位置,从控制台到文件再到网络端口和数据库。但是,您现在所拥有的简单配置应该也会在控制台上打印。因此,首先删除show_sql属性,看看Log4j是否会在控制台上输出任何内容。

如果这没有起作用,说明Log4j未正确配置。如果您使用的是hibernate > 3.5,则使用slf4j api,它默认使用logback而不是log4j。您可以通过从类路径中删除logback jar,并添加slf4j-log4j12.jar和log4j.jar来轻松切换到log4j。

Log4j跟踪还使用“?”打印查询,但它还会打印参数绑定,即数据库驱动程序或服务器将“?”替换为什么。


你的答案似乎是正确的,我的项目中已经配置了logback,这就是为什么它没有获取log4j的原因,我无法删除它,所以我需要在logback中找到解决方案,感谢您理解问题所在。谢谢。 - commit
1
如果你想使用Logback,只需将log4j-over-slf4j.jar放到类路径中,完全不必担心Log4j配置,然后@commit即可。 - Vadzim
1
Hibernate 4使用JBoss日志记录器而不是slf4j。请参见http://docs.jboss.org/hibernate/orm/4.3/topical/html/logging/Logging.html。 - G. Stevens

3
请根据您的版本参考Hibernate参考文档,这里是3.3版本的链接
编辑:
  1. In order to setup logging you will need slf4j-api.jar in your classpath together with the jar file for your preferred binding - slf4j-log4j12.jar in the case of Log4J.
  2. Put log4j.properties file in your classpath. An example properties file is distributed with Hibernate in the src/ directory.
  3. Enable following log 4j categories.

    org.hibernate.SQL   Log all SQL DML statements as they are executed
    
    org.hibernate.type  Log all JDBC parameters
    

1
你能否详细阐述一下你的答案?链接往往会随着时间而失效。 - orique

2

请添加以下内容

<property name="show_sql">true</property>
<property name="format_sql">true</property>
<property name="use_sql_comments">true</property>

您的问题将会被解决。


"use_sql_comments" 只会显示 SQL 注释,它并不能解决我的问题。 - commit
2
对于非 XML 属性: log4j.logger.org.hibernate.SQL=DEBUG log4j.logger.org.hibernate.TYPE=DEBUG log4j.logger.org.hibernate.USE_SQL_COMMENTS=DEBUG - Alan B. Dee

2
在大多数情况下,只需要在应用程序的类路径中包含log4j.properties就足够了。
请参见如何正确初始化log4j?
问题中的链接已经建议您查找绑定的SQL参数值不是在SQL文本中而是在单独的日志语句中,例如: TRACE [BasicBinder] binding parameter [1] as [VARCHAR] - john doe
但我建议使用log4jdbc。它非常简单易用。并且能够将查询参数值嵌入打印的SQL文本中。

0

0

你不能在行内打印值。当记录查询时,Hibernate将始终打印问号。在DEBUG级别下输出org.hibernate.type日志显示用于替换这些问号的值和类型。


0

0
在我的情况下,不是hibernate.cfg.xml文件,而是log4j.xml文件,我把@jdev给出的代码放在了这个文件中。 < property name="show_sql">true 显示SQL查询

< property name="format_sql">true 格式化在控制台上显示的查询

< property name="use_sql_comments">true 将注释添加到查询中

如果您的项目有数千个查询打印到控制台,请将其他设置为false: < property name="show_sql">true < property name="format_sql">false < property name="use_sql_comments">false 或者在log4j.xml中编写一个appender,在指定的文本文件中编写所有SQL查询,我已经在我的项目中完成了这个操作,具体请参见此处链接:使用Log4j XML配置文件配置Hibernate日志记录?

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