如何从Hibernate获取更多调试消息?

时间:2009-09-04 18:44:37

标签: java hibernate debugging jboss log4j

尽管在hibernate.cfg.xml文件中设置了一些属性,但我还是无法从Hibernate获得更多的控制台输出(以帮助调试)。例如,添加行<property name="show_sql">true</property>实际上并未在控制台中显示SQL语句。

我也尝试过使用log4j.properties文件的内容 - 比如设置log4j.logger.org.hibernate=debug - 没有运气。我错过了什么?


编辑: hibernate-service.xml文件的内容为

<server> 
    <mbean code="org.jboss.hibernate.jmx.Hibernate" 
       name="jboss.har:service=Hibernate_SMS"> 
        <attribute name="DatasourceName">java:/SMS_DS</attribute> 
        <attribute name="Dialect">org.hibernate.dialect.HSQLDialect</attribute> 
        <attribute name="SessionFactoryName">java:/hibernate/SessionFactory</attribute> 
        <attribute name="CacheProviderClass">org.hibernate.cache.HashtableCacheProvider</attribute>
        <attribute name="ShowSqlEnabled">true</attribute>
    </mbean> 
</server>
但是,我不能100%确定这是否真的有任何影响。该XML文件位于Eclipse项目中,用于处理我的数据库内容,但似乎不在JBoss部署目录中。


编辑2:这肯定是作为HAR部署的。也就是说,我很确定我需要hibernate.cfg.xml - 我记得当映射文档作为该文件中的条目被省略时会出现问题。我认为HAR是使用ant生成的 - 在build.xml文件中有一个目标:

<target name="har" depends="prepare" description="Builds the Hibernate HAR file">
    <mkdir dir="${class.root}" />
    <mkdir dir="${distribution.dir}" />

    <jar destfile="${distribution.dir}/${har.name}">                    
        <!-- include the hbm.xml files  -->
        <fileset dir="${class.root}">
            <include name="**/*.hbm.xml"/>
            <include name="com/[redacted]/sms/data/dto/*.class"/>
            <include name="com/[redacted]/sms/data/dto/base/*.class"/>
        </fileset>

        <!-- include jboss-service.xml -->
        <metainf dir="${hibernate.dir}">
            <include name="hibernate-service.xml"/>
        </metainf>
    </jar>
</target>

但是当我在hibernate-service.xml文件中使用格式错误的xml进行ant构建时,它不会失败。 更新即使完全删除文件也不会导致构建失败。这里有什么想法? 结束更新

听起来让Hibernate输出SQL语句应该(如果一切设置正确)完全处理它 - 这是否意味着log4j.properties中的设置在这里不会产生影响? - 因为实际上 在运行ant时会改变输出。

编辑3:在遇到我的数据har的其他奇怪问题后,我完全删除了har文件并使用har ant构建目标重建了它。突然间一切正常!感谢国际象棋,因为他非常乐于助人。不能说我到底知道到底是做了什么,但我更愿意承认他的努力,而不是写下并接受我自己的答案;如果你不是“他”,我道歉。

3 个答案:

答案 0 :(得分:14)

正确的属性名称是hibernate.show_sql,它肯定有效。

确保您的hibernate.cfg.xml是正确的,并且它已被拿起;同样适合您的log4j.properties文件。我知道这些似乎是愚蠢的建议,但它们占“缺少日志记录输出”问题的98%。

更新:我会更新答案,而不是继续添加评论。 您需要确保JBoss选择了hibernate-service.xml。检查的简单方法是向它添加一个语法错误(比如在某个元素上省略右括号)并查看JBoss在重启期间是否爆炸:-)它应打包到har并作为你的一部分进行部署构建过程,所以如果你意识到它是而不是被JBoss选中,那就是这个地方。我将摆脱hibernate.cfg.xml中的冲突设置(例如,您指定为mbean属性的所有内容都不应在hibernate.cfg.xml中复制)。就此而言,你甚至需要hibernate.cfg.xml吗?如果部署为HAR,则应自动扫描/拾取您的映射。

答案 1 :(得分:8)

我只使用log4j.properties文件来记录Hibernate语句。对于SQL语句, log4j.logger.org.hibernate.SQL 属性需要设置为 debug ,对于SQL参数/返回值, log4j.logger .org.hibernate.type 属性需要设置为跟踪

这是我使用的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

### Root logger
log4j.rootLogger=debug, stdout

### Main Hibernate
log4j.logger.org.hibernate=debug

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

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

答案 2 :(得分:1)

还要确保您使用正确的log4j配置。

在jboss中运行时(你正在这样做,对吧?),你可以在$JBOSS_HOME/server/<config>/conf/jboss-log4j.xml中配置log4j-logging。

有两个默认的appender; FILElog/server.logCONSOLE写入stdout(有时会重定向log/console.log)。将appender上的阈值调整为文件中的DEBUG或通过设置systemproperty jboss.server.log.threshold(取决于您使用的jboss版本)。

您还需要通过添加类别来调整休眠的日志记录优先级:

<category name="org.hibernate">
  <priority value="DEBUG"/>
</category>