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

Posted

技术标签:

【中文标题】使用 Log4j XML 配置文件配置 Hibernate 日志记录?【英文标题】:Configuring Hibernate logging using Log4j XML config file? 【发布时间】:2010-09-30 23:30:15 【问题描述】:

我找不到任何关于如何使用 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="%dABSOLUTE [%t] %-5p %c1 - %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 文件中执行此操作。

【问题讨论】:

nemo,你有没有发现如何通过 xml 方式做到这一点?如果你这样做了,也许你可以发布你的问题的答案。 homaxto,我做到了。有机会我会发给你的。 是否将休眠日志也转到 catalina.out,如果您不想看到 catalina.out 完整,则应注释此标签休眠日志 【参考方案1】:

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

必须放在根元素之前。

【讨论】:

我不确定 在那里做什么,当我将它更改为我的配置中的附加程序时,休眠似乎仍然登录到控制台和我的文件附加程序。奇怪。 这很奇怪,在 Hibernate 3.2.6 for org.hibernate.type 中,您可以使用 DEBUG 级别并记录所有参数。在hibernate 3.5.6 DEBUG 是不够的,你必须放TRACE,恕我直言(一旦你知道了),因为它确实记录了很多! 类名在 Hibernate 4.2 上被重构,所以对于事务日志你必须使用org.hibernate.engine.transaction。见:docs.jboss.org/hibernate/orm/4.2/devguide/en-US/html/… 您还可以将记录器添加到standalone.xml,如下所示: 例如&lt;Logger name="org.hibernate.SQL" level="debug" /&gt; 中的L 是否应该大写?大写 L:"The content of element type 'log4j:configuration' must match '(renderer*,throwableRenderer*,appender*,plugin*,(category|logger)*,root?,(categoryFactory|loggerFactory)?)'." 时,Tomcat 在启动时出现错误。我也很困惑这应该如何实际输入到我的 log4j.xml 文件中。我应该为每个类别设置一个单独的&lt;logger&gt; 块,并附上&lt;level&gt; 标签,还是我可以放弃你提供的单行字?【参考方案2】:

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

多次翻腾、挥动手臂和一般的死老鼠奔跑终于让我的奶酪落到了我的身上。

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

【讨论】:

是的,您需要 slf4j-log4j12-1.5.10.jar 将外观连接到底层日志记录层。如果使用 log4j 作为日志层,配置文件仍然是 log4j 配置。【参考方案3】:

回应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="%dABSOLUTE [%t] %-5p %c1 - %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>

希望这会有所帮助。

【讨论】:

【参考方案4】:

这是我使用的:

<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 消息;) -- 将级别设置为“调试”以获取输出。

【讨论】:

【参考方案5】:

答案很有用。更改后,我得到了重复的 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>

【讨论】:

【参考方案6】:

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

<appender name="console" class="org.apache.log4j.ConsoleAppender">
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%dyy-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>

如果您不想让休眠记录每个查询,请将休眠属性show_sql 设置为false

【讨论】:

以上是关于使用 Log4j XML 配置文件配置 Hibernate 日志记录?的主要内容,如果未能解决你的问题,请参考以下文章

如何在spring 配置文件中配置log4j.xml

使用 Log4j 在 控制台和文件输出信息的xml 配置!

log4j配置文件加载

log4j2的配置文件log4j2.xml笔记

如何使用 log4j2.xml 配置休眠日志记录?

将 formatMsgNoLookups 放在 Log4j XML 配置文件的啥位置