2010-02-22 78 views
2

我一直試圖讓這個簡單的用例工作,但不能:定義一個文件Appender信息的默認閾值,但用DEBUG級別定義一個類別。這是一個jboss 4.2.1.GA log4j.xml文件,我正在使用它只記錄java.sql調用。log4j:不同的類別優先級比appender閾值

<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

回答

0

據我所知,java.sql包中的類實際上並沒有做任何日誌記錄,而且它們肯定是不會寫入log4j(甚至是commons-logging)。

然而,對於理論目的,這裏是如果它是一個不同的包,你將如何解決這個問題(並實際使用的共享記錄):

  1. SQL_FILE附加器中取出門檻。
  2. 添加行:<priority value="INFO"/><root/>元素(之前的appender-ref)。
  3. 保存並重新啓動JBoss。

最後,請注意,對於某些JDBC問題,DriverManager.setLogWriter方法可能會有所幫助(請參閱http://java.sun.com/products/jdbc/reference/faqs/index.html#4)。

編輯: 既然你已經表明你真正感興趣的記錄iBatis的輸出,你應該只改變<category name="java.sql"><category name="com.ibatis">

+0

感謝您的答覆。請參閱下面的解決方案這很諷刺,但你說得對,java.sql實際上並沒有做任何日誌記錄。但我猜想通過ibatis我能夠得到輸出。下面是一個示例: 2010-02-22 16:48:45,469 DEBUG [java.sql.Connection] com.ibatis.common.logging.jakarta.JakartaCommonsLoggingImpl {conn-100000}連接 2010-02-22 16 :48:45,479 DEBUG [java.sql.Connection] com.ibatis.common.logging.jakarta.JakartaCommonsLoggingImpl {conn-100000}準備語句:SELECT ....... –

+0

詹姆斯沒有什麼諷刺的。 java.sql是一個核心JAVA包。它不應該使用log4j或commons-logging。 java.util.logging.Logger是一個JDK類,可用於JDK 1.4。 –

1

我很快找到了解決方案。基本上這個用例在jboss wiki中有描述:http://docs.jboss.org/process-guide/en/html/logging.html10.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> 

注意,你不想來定義根SQL_FILE附加器;因爲某些原因。這是最後一塊。

+0

該解決方案對於性能不是很好。在JBoss 4.2.1中,默認情況下,'root'記錄器被設置爲'DEBUG',並且appender使用閾值來解決這個問題。這意味着任何檢查Log.isDebugEnabled()的Java代碼都會執行。在調試器中試試看看:-)。我的解決方案將避免這個問題。 –

+0

事實上,如果__everything__將DEBUG輸出寫入'SQL_FILE' appender,而不僅僅是iBatis,我不會感到驚訝。 –

0

JBoss 4.2.1.GA所需的額外步驟是從war中刪除任何log4j jar文件。如果這個jar包含在你的war中,sql.log文件永遠不會寫入。

例行家的pom.xml條目:

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