log4j:与appender阈值不同的类别优先级

时间:2010-02-22 22:12:55

标签: java jboss log4j

我一直试图让这个简单的用例工作但不能:在FILE Appender上定义INFO的默认阈值,但是定义一个具有DEBUG级别的类别。这是我正在使用的jboss 4.2.1.GA log4j.xml文件,我只想记录java.sql调用。

   <appender name="SQL_FILE" 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="false"/>
      <param name="Threshold" value="INFO"/>

      <param name="DatePattern" value="'.'yyyy-MM-dd"/>

      <layout class="org.apache.log4j.PatternLayout">
         <param name="ConversionPattern" value="%d %-5p [%c] %C %m%n"/>
      </layout>
   </appender>

  <category name="java.sql">
    <priority value="DEBUG"/>
    <appender-ref ref="SQL_FILE"/>
  </category>

   <root>
      <appender-ref ref="SQL_FILE"/>
   </root>

它不仅仅记录java.sql,而是记录INFO及以上,并且不包含任何java.sql信息。如果没有简单的解决方案,那么我只需将appender Threshold设置为DEBUG并关闭所包含的多个类别的所有日志记录,这似乎是浪费时间。

我尝试了以下操作但无法使其正常工作:Configuring multiple log files in log4j while using categories

3 个答案:

答案 0 :(得分:1)

我很快找到了解决方案。基本上这个用例在jboss wiki中描述:http://docs.jboss.org/process-guide/en/html/logging.html 第10.3.5节重定向类别输出。这篇博客文章也很有用:ptth://ourcraft.wordpress.com/2008/10/23/customizing-log4j-logging-on-jboss/#comment-796。

最终,我使用的是:

   <appender name="SQL_FILE" 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="false"/>

      <param name="DatePattern" value="'.'yyyy-MM-dd"/>

      <layout class="org.apache.log4j.PatternLayout">
         <param name="ConversionPattern" value="%d %-5p [%c] %C %m%n"/>
      </layout>

   </appender>

<category name="java.sql.Connection"  additivity="false">
    <priority value="DEBUG"/>
    <appender-ref ref="SQL_FILE"/>
</category>  

   <root>
      <appender-ref ref="CONSOLE"/>
      <appender-ref ref="FILE"/>
   </root>

请注意,您不希望在root中定义SQL_FILE appender;由于某些原因。那是最后一块。

答案 1 :(得分:0)

据我所知,java.sql包中的类实际上并没有进行任何日志记录,而且肯定不会写入log4j(甚至是commons-logging)。

但是,对于理论目的,如果它是一个不同的包(并且实际使用了commons-logging),这里是你如何解决这个问题:

  1. SQL_FILE appender。
  2. 中删除阈值
  3. 将行<priority value="INFO"/>添加到<root/>元素(appender-ref之前)。
  4. 保存并重新启动JBoss。
  5. 最后,请注意,对于某些JDBC问题,DriverManager.setLogWriter方法可能会有所帮助(请参阅http://java.sun.com/products/jdbc/reference/faqs/index.html#4)。

    修改 由于您已表明您确实对记录iBatis输出感兴趣,因此您应该将<category name="java.sql">更改为<category name="com.ibatis">

答案 2 :(得分:0)

JBoss 4.2.1.GA需要的另一个步骤是从战争中删除任何log4j jar文件。如果你的战争中包含这个jar,那么永远不会写入sql.log文件。

示例maven pom.xml条目:

<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.13</version>
    <scope>provided</scope>
</dependency>