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


89

我还没有找到任何有关如何使用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>

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


nemo,ypu曾经发现过如何以xml方式执行此操作吗?也许您可以发布问题的答案。
homaxto

homaxto,我做到了。一旦有机会,我会为您发布。
James McMahon

<附加器-REF REF =“控制台” />这是否休眠日志转到也catalina.out的,你应该,如果你不希望看到catalina.out的完整的Hibernate日志的评论此标记
恩里克圣马丁

Answers:


161

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

必须将其放在根元素之前。


我不确定<appender-ref>在做什么,当我在配置中将其更改为追加器时,休眠似乎仍然登录到控制台和文件追加器。奇怪。
James McMahon

这很奇怪,在Hibernate 3.2.6的org.hibernate.type中,您可以使用DEBUG级别,并且它记录了所有参数。在休眠3.5.6中,DEBUG是不够的,您必须放入TRACE,这是恕我直言的(一旦知道),因为它确实记录了很多东西!
Riccardo Cossu 2011年

在Hibernate 4.2上重构了类名,因此对于事务记录您必须使用org.hibernate.engine.transaction。参见:docs.jboss.org/hibernate/orm/4.2/devguide/en-US/html/…–
gerrytan

您还可以将记录器添加到standalone.xml中,如下所示:<logger categoriy =“ org.hibernate”> <级别名称=“ DEBUG” /> </ logger>
cw24 '16

1
L例如,应将in <Logger name="org.hibernate.SQL" level="debug" />实际大写吗?大写L:时,启动时在Tomcat中出现错误"The content of element type 'log4j:configuration' must match '(renderer*,throwableRenderer*,appender*,plugin*,(category|logger)*,root?,(categoryFactory|loggerFactory)?)'."。我也对应该如何将其实际输入到log4j.xml文件中感到困惑。我是否应该<logger>为每个类别单独添加一个块,并加上<level>标签,还是可以摆脱您展示的单线?
MegaMatt

25

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

uch不休,挥舞着手臂,普通的老鼠死了,终于把我的奶酪降落了。

因为Hibernate 3使用的是Java的简单日志记录外观(SLF4J)(根据文档),所以如果您依赖Log4j 1.2,则如果希望使用以下命令完全配置Hibernate日志记录,则需要slf4j-log4j12-1.5.10.jar。一个log4j配置文件。希望这对下一个家伙有帮助。


是的,您需要slf4j-log4j12-1.5.10.jar将立面连接到基础日志记录层。如果将log4j用作日志记录层,则配置文件仍是log4j配置。
詹姆斯·麦克马洪

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>

希望这可以帮助。


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


3

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

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

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>

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

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

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

或使用另一个追加程序,中断可加性(可加性默认值为true)

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

而且,如果您不希望该休眠记录每个查询,请将hibernate属性设置show_sqlfalse

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.