2014年7月24日 星期四

使用 log4j 時,讓 Apache HttpClient 的 log 消失

如果有同時使用 log4j 和 HttpClient,應該很多人都有這個慘痛的經驗~
HttpClient 在執行時會把所有發送和接收的資料全部以 debug 等級的 log 輸出到 log4j
一般在做 JSON 處理時還好,這個 log 大概對於 debug 蠻有幫助的
但如果是在實作檔案上傳或者下載時,印出來的 log 等於是把要上傳或下載的檔案全部輸出到 log4j,是相當驚人的文字量
而且有時候會把 eclipse 弄到當機...。

如果想要讓 HttpClient 的 log 消失,其實是可以直接在 log4j 的設定檔上面設定的
log4j 有支援針對特定類別做個別的輸出設定,因此可以很方便地指定各種不同 log 該出現或不出現。

因為在我的環境中,HttpClient 的內容都是印在 org.apache.http.wire 這個類別,因此目標是設定 log4j 忽略這個類別的 log。
如果設定檔是 log4j.properties,則可以加入以下的設定,要求 log4j 針對 org.apache.http.wire 只顯示 WARNING 等級以上的 log。
log4j.logger.org.apache.http.wire=WARN

如果設定檔是 XML 格式時,則是把設定寫在 log4j:configuration 標籤內,例如:
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
  <logger name="org.apache.http.wire">
    <!-- Print only messages of level warn or above in the package org.apache.http.wire -->
    <level value="warn" />
  </logger>
</log4j:configuration>

參考資料:
1、Disable HttpClient logging
2、Log4j XML Configuration Primer

沒有留言:

張貼留言