使用Log4j XML配置文件配置Hibernate日志记录?

时间:2009-01-12 17:40:34

标签: xml hibernate logging configuration log4j

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

这是否可能,或者我是否使用属性样式配置文件来控制Hibernate的日志记录?

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

修改
为了澄清,我正在寻找一个控制Hibernate的实际XML语法的例子。

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>

日志记录工作正常,但我正在寻找一种方法来降低和控制hibernate日志记录,这与我的应用程序级别日志记录分开,因为它当前充斥着我的日志。我找到了使用首选项文件执行此操作的示例,我只是想知道如何在XML文件中执行此操作。

6 个答案:

答案 0 :(得分:152)

来自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>

必须放在根元素之前。

答案 1 :(得分:25)

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

多次捶打,挥舞着手臂和一般死老鼠的跑步终于让我吃了我的奶酪。

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

答案 2 :(得分: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>

希望这有帮助。

答案 3 :(得分: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消息;) - 将级别设置为“debug”以获得输出。

答案 4 :(得分:3)

答案很有用。在更改之后,我得到了SQL语句的重复日志记录,一个在log4j日志文件中,另一个在标准控制台上。我将persistence.xml文件更改为将show_sql设置为false以从标准控制台中删除日志记录。保持format_sql为true也会影响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>

答案 5 :(得分:0)

您可以使用类似标签配置log4j文件(例如,使用控制台appender):

<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>

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

要更改库的日志级别,只需将类别添加到例如desactive spring info log:

<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_sql设置为false