2009-01-12 149 views
80

我一直无法找到任何有关如何使用Log4j的XML样式配置文件来配置Hibernate日志记录的文档。使用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> 

记录工作正常,但我正在寻找一种方式下台并控制Hibernate日志中,从我的应用程序级别的日志分开的方式,因为它是目前充斥我的日志。我已经找到了使用首选项文件来做到这一点的例子,我只是想知道如何在XML文件中做到这一点。

+0

nemo,做过ypu有没有发现如何做到这一点的XML方式?如果你有问题,也许你可以回答你的问题。 – homaxto 2009-02-06 13:18:30

+0

homaxto,我做到了。一旦我有机会,我会为你发布。 – 2009-02-06 15:52:27

+0

不会让hibernate日志转到catalina.out,如果你不想看到充满休眠日志的catalina.out,你应该评论这个标记 – 2012-12-27 12:00:28

回答

143

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

NB:大多数记录仪的使用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> 

它必须在根元素之前被放置。

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

25

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

很多颠簸,挥舞着手臂和一般的死老鼠跑了终于降落我我的奶酪。

因为休眠3是使用Simple Logging Facade for Java(SLF4J)(每文档),如果您依靠Log4j的1.2则还需要SLF4J-log4j12-1.5.10.jar,如果你想到完全用log4j配置文件配置Hibernate日志记录。希望这有助于下一个人。

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> 
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春天信息的日志:

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

或与其他附加器,打破了加(加默认值是true)

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

如果你不想这样冬眠记录每一个查询,show_sql设置休眠属性false