使用log4j,是否可以使用org.hibernate.type TRACE日志记录隐藏JDBC返回的列值?

时间:2010-12-16 20:12:17

标签: hibernate jdbc log4j

我正在使用Seam Framework项目上的log4j跟踪Hibernate生成的SQL语句及其绑定参数。目前我有以下配置:

的JBoss-的log4j.xml

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="false">

...

   <appender name="SQL" class="org.jboss.logging.appender.DailyRollingFileAppender">
      <errorHandler class="org.jboss.logging.util.OnlyOnceErrorHandler"/>
      <param name="File" value="${jboss.server.log.dir}/sql.log"/>
      <param name="Append" value="true"/>
      <layout class="org.apache.log4j.PatternLayout">
         <param name="ConversionPattern" value="%d{ABSOLUTE} [%c{1}] %X{username} %m%n"/>
      </layout>
   </appender>

   <category name="org.hibernate">
       <priority value="INFO"/>
       <appender-ref ref="SQL"/>
   </category>

   <category name="org.hibernate.SQL" additivity="false">
       <priority value="DEBUG"/>
       <appender-ref ref="SQL"/>
   </category>

   <category name="org.hibernate.HQL" additivity="false">
       <priority value="DEBUG"/>
       <appender-ref ref="SQL"/>
   </category>

   <category name="org.hibernate.type" additivity="false">
       <priority value="TRACE"/>
       <appender-ref ref="SQL"/>
   </category>

</log4j:configuration>

问题是生成的sql.log文件变得太笨重,因为每次访问页面时至少会有100k文本附加到日志中。我想过滤掉“作为列返回”的JDBC消息,而只是跟踪INSERT / UPDATE查询,但在Hibernate或log4j的文档中找不到这样的选项。不希望使用手动脚本编制过程删除这些行,因为我想减少Web服务器上的磁盘读/写。

是否可以在保持参数值绑定的同时停止将这些返回的SELECT查询JDBC值添加到日志文件中?

1 个答案:

答案 0 :(得分:1)

不幸的是两个日志记录语句:

binding '...' to parameter: ...

returning '...' as column: ...

来自同一个班级org.hibernate.type.NullableType,并且记录在同一TRACE级别。这意味着您不能简单地过滤后一个日志语句而不改变第一个日志语句。

但是,如果您使用Logbackfilters可能会拯救。