89

我找不到任何关于如何使用 Log4j 的 XML 样式配置文件配置 Hibernate 日志记录的文档。

这甚至可能还是我使用属性样式配置文件来控制 Hibernate 的日志记录?

如果有人有任何信息或文档链接,将不胜感激。

编辑:
为了澄清,我正在寻找一个实际的 XML 语法示例来控制 Hibernate。

EDIT2:
这是我的 XML 配置文件中的内容。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
    <appender name="console" class="org.apache.log4j.ConsoleAppender">
        <param name="Threshold" value="info"/>
        <param name="Target" value="System.out"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d{ABSOLUTE} [%t] %-5p %c{1} - %m%n"/>
        </layout>
    </appender>
    <appender name="rolling-file" class="org.apache.log4j.RollingFileAppender">
        <param name="file" value="Program-Name.log"/>
        <param name="MaxFileSize" value="1000KB"/>
    <!-- Keep one backup file -->
        <param name="MaxBackupIndex" value="4"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d [%t] %-5p %l - %m%n"/>
        </layout>
    </appender>

    <root>
        <priority value ="debug" />
        <appender-ref ref="console" />
        <appender-ref ref="rolling-file" />
    </root>
</log4j:configuration>

日志记录工作正常,但我正在寻找一种方法来降低和控制休眠日志记录,这种方式与我的应用程序级日志记录不同,因为它目前正在淹没我的日志。我找到了使用首选项文件执行此操作的示例,我只是想知道如何在 XML 文件中执行此操作。

4

6 回答 6

164

来自http://docs.jboss.org/hibernate/core/3.3/reference/en/html/session-configuration.html#configuration-logging

这是记录器类别的列表:

Category                    Function

org.hibernate.SQL           Log all SQL DML statements as they are executed
org.hibernate.type          Log all JDBC parameters
org.hibernate.tool.hbm2ddl  Log all SQL DDL statements as they are executed
org.hibernate.pretty        Log the state of all entities (max 20 entities) associated with the session at flush time
org.hibernate.cache         Log all second-level cache activity
org.hibernate.transaction   Log transaction related activity
org.hibernate.jdbc          Log all JDBC resource acquisition
org.hibernate.hql.ast.AST   Log HQL and SQL ASTs during query parsing
org.hibernate.secure        Log all JAAS authorization requests
org.hibernate               Log everything (a lot of information, but very useful for troubleshooting) 

格式化为粘贴到 log4j XML 配置文件中:

<!-- Log all SQL DML statements as they are executed -->
<Logger name="org.hibernate.SQL" level="debug" />
<!-- Log all JDBC parameters -->
<Logger name="org.hibernate.type" level="debug" />
<!-- Log all SQL DDL statements as they are executed -->
<Logger name="org.hibernate.tool.hbm2ddl" level="debug" />
<!-- Log the state of all entities (max 20 entities) associated with the session at flush time -->
<Logger name="org.hibernate.pretty" level="debug" />
<!-- Log all second-level cache activity -->
<Logger name="org.hibernate.cache" level="debug" />
<!-- Log transaction related activity -->
<Logger name="org.hibernate.transaction" level="debug" />
<!-- Log all JDBC resource acquisition -->
<Logger name="org.hibernate.jdbc" level="debug" />
<!-- Log HQL and SQL ASTs during query parsing -->
<Logger name="org.hibernate.hql.ast.AST" level="debug" />
<!-- Log all JAAS authorization requests -->
<Logger name="org.hibernate.secure" level="debug" />
<!-- Log everything (a lot of information, but very useful for troubleshooting) -->
<Logger name="org.hibernate" level="debug" />

注意:大多数记录器使用 DEBUG 级别,但是 org.hibernate.type 使用 TRACE。在以前的 Hibernate 版本中,org.hibernate.type 也使用 DEBUG,但从 Hibernate 3 开始,您必须将级别设置为 TRACE(或 ALL)才能查看 JDBC 参数绑定日志记录。

并且指定了一个类别:

<logger name="org.hibernate">
    <level value="ALL" />
    <appender-ref ref="FILE"/>
</logger>

它必须放在根元素之前。

于 2009-01-12T19:32:28.270 回答
26

Loki回答指向 Hibernate 3 文档并提供了很好的信息,但我仍然没有得到我预期的结果。

大量的鞭打,挥动手臂和一般死老鼠的奔跑终于让我的奶酪落到了我的身上。

因为 Hibernate 3 正在使用Simple Logging Facade for Java (SLF4J)(根据文档),如果您依赖 Log4j 1.2,如果您想要完全配置 Hibernate 日志记录,则需要slf4j-log4j12-1.5.10.jar log4j 配置文件。希望这对下一个人有所帮助。

于 2010-02-25T17:06:58.770 回答
7

回应 homaxto 的评论,这就是我现在所拥有的。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
    <appender name="console" class="org.apache.log4j.ConsoleAppender">
        <param name="Threshold" value="debug"/>
        <param name="Target" value="System.out"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d{ABSOLUTE} [%t] %-5p %c{1} - %m%n"/>
        </layout>
    </appender>
    <appender name="rolling-file" class="org.apache.log4j.RollingFileAppender">
        <param name="file" value="Program-Name.log"/>
        <param name="MaxFileSize" value="500KB"/>
        <param name="MaxBackupIndex" value="4"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d [%t] %-5p %l - %m%n"/>
        </layout>
    </appender>

    <logger name="org.hibernate">
        <level value="info" />
    </logger>

    <root>
        <priority value ="debug" />
        <appender-ref ref="console" />
        <appender-ref ref="rolling-file" />
    </root>
</log4j:configuration>

关键部分是

<logger name="org.hibernate">
    <level value="info" />
</logger>

希望这可以帮助。

于 2009-02-06T15:56:45.230 回答
5

这是我使用的:

<logger name="org.hibernate">
    <level value="warn"/>
</logger>

<logger name="org.hibernate.SQL">
    <level value="warn"/>
</logger>

<logger name="org.hibernate.type">
    <level value="warn"/>
</logger>

<root>
    <priority value="info"/>
    <appender-ref ref="C1"/>
</root> 

显然,我不喜欢看到 Hibernate 消息;)——将级别设置为“调试”以获取输出。

于 2009-03-12T16:19:58.977 回答
3

答案很有用。更改后,我得到了重复的 SQL 语句日志记录,一个在 log4j 日志文件中,一个在标准控制台上。我将 persistence.xml 文件更改为将 show_sql 设置为 false 以摆脱标准控制台的日志记录。保持 format_sql 为真也会影响 log4j 日志文件,所以我保持不变。

<persistence xmlns="http://java.sun.com/xml/ns/persistence"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
        version="2.0">
    <persistence-unit name="myUnit" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <properties>
            <property name="javax.persistence.jdbc.driver" value="org.hsqldb.jdbcDriver"/>
            <property name="javax.persistence.jdbc.url" value="jdbc:hsqldb:file:d:\temp\database\cap1000;shutdown=true"></property>
            <property name="dialect" value="org.hibernate.dialect.HSQLDialect"/>
            <property name="hibernate.show_sql" value="false"/>
            <property name="hibernate.format_sql" value="true"/>
            <property name="hibernate.connection.username" value="sa"/>
            <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
        </properties>
    </persistence-unit>
</persistence>
于 2012-07-25T18:58:31.153 回答
0

您可以log4j像这样使用类别标签配置文件(例如,使用控制台附加程序):

<appender name="console" class="org.apache.log4j.ConsoleAppender">
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d{yy-MM-dd HH:mm:ss} %p %c - %m%n" />
    </layout>
</appender>
<category name="org.hibernate">
    <priority value="WARN" />
</category>
<root>
    <priority value="INFO" />
    <appender-ref ref="console" />
</root>

因此,将显示来自休眠的每个警告、错误或致命消息,仅此而已。此外,您的代码和库代码将处于信息级别(因此信息、警告、错误和致命)

要更改库的日志级别,只需添加一个类别,例如,停用弹簧信息日志:

<category name="org.springframework">
    <priority value="WARN" />
</category>

或者用另一个 appender,打破可加性(additivity 默认值为 true)

<category name="org.springframework" additivity="false">
    <priority value="WARN" />
    <appender-ref ref="anotherAppender" />
</category>

如果您不想让 hibernate 记录每个查询,请将 hibernate 属性设置show_sqlfalse.

于 2013-10-08T14:07:44.513 回答