java - HttpClient लॉगिंग अक्षम करें




logging apache-commons-httpclient (14)

Jwebunit एकीकरण परीक्षण चलाते समय मुझे भी यही समस्या थी। मैंने लॉगबैक को छोड़कर और slf4j-log4j12 में जोड़कर इसे ठीक किया है, जैसे:

<dependency>
  <groupId>net.sourceforge.jwebunit</groupId>
  <artifactId>jwebunit-htmlunit-plugin</artifactId>
  <version>3.0</version>
  <exclusions>
    <exclusion>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-classic</artifactId>
    </exclusion>
  </exclusions>
</dependency>
<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-log4j12</artifactId>
</dependency>

मैं एकीकरण परीक्षण सूट में कॉमन्स-httpclient 3.1 का उपयोग कर रहा हूँ। HttpClient के लिए डिफ़ॉल्ट लॉगिंग बेहद शोर है और मैं इसे बंद नहीं कर सकता। मैंने here निर्देशों here पालन ​​करने का प्रयास किया here लेकिन उनमें से कोई भी कोई फर्क नहीं पड़ता।

अधिकतर मुझे सिर्फ org.apache.http.wire लॉगर बंद करने की आवश्यकता है। समस्या का एक हिस्सा यह है कि मुझे नहीं पता कि किस प्रकार का लॉगर एचटीपी क्लाइंट उपयोग करने का प्रयास कर रहा है और अधिकांश समस्या यह है कि मैंने पहले कभी इस लाइब्रेरी का उपयोग नहीं किया है। मैंने log4j.properties फ़ाइल बनाने और इसे अपने परीक्षण / संसाधन फ़ोल्डर में छोड़ने, jre / lib में मास्टर logging.properties फ़ाइल को संशोधित करने और here पर निर्दिष्ट मैवेन के विभिन्न लॉगिंग विकल्पों में भेजने की कोशिश की, और उनमें से कोई भी नहीं कोई फर्क पड़ता है।

किसी भी मदद की सराहना की जाती है ... यह मुझे पागल कर रही है।

अद्यतन: एक सुधार: ऐसा लगता है कि प्रश्न में आउटपुट वास्तव में jwebunit के HttpClient के उपयोग के माध्यम से उत्पन्न होता है, न कि मेरे। किसी भी तरह से, यह वांछनीय नहीं है।

अद्यतन: अब तक प्रयासों के लिए धन्यवाद। मैंने नीचे सुझाए गए सब कुछ की कोशिश की है लेकिन अभी भी कोई भाग्य नहीं है। मेरे पास निम्नलिखित सामग्री के साथ मेरे src / test / संसाधन फ़ोल्डर में एक फ़ाइल commons-logging.properties है

org.apache.commons.logging.LogFactory=org.apache.commons.logging.impl.Log4jFactory
log4j.configuration=log4j.properties

और निम्न सामग्री के साथ एक ही फ़ोल्डर में एक फ़ाइल log4j.properties

log4j.rootLogger=ERROR, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%c] %m%n

#This is the line that should make httpclient shut up
log4j.logger.org.apache.http=ERROR

हालांकि, जब मैं अपने परीक्षण चलाता हूं तब भी मुझे आउटपुट का एक गुच्छा मिलता है:

21:57:41.413 [main] DEBUG org.apache.http.wire - << "                                   [\r][\n]"
21:57:41.413 [main] DEBUG org.apache.http.wire - << "[\r][\n]"
21:57:41.413 [main] DEBUG org.apache.http.wire - << "                                   [\r][\n]"
21:57:41.413 [main] DEBUG org.apache.http.wire - << "                               </ul>[\n]"
21:57:41.413 [main] DEBUG org.apache.http.wire - << "    [\n]"
21:57:41.424 [main] DEBUG org.apache.http.wire - << "[\n]"
21:57:41.425 [main] DEBUG org.apache.http.wire - << "[\r][\n]"
21:57:41.425 [main] DEBUG org.apache.http.wire - << "[\r][\n]"
21:57:41.425 [main] DEBUG org.apache.http.wire - << "                   </div>[\r][\n]"
21:57:41.425 [main] DEBUG org.apache.http.wire - << "                </li>[\r][\n]"
21:57:41.425 [main] DEBUG org.apache.http.wire - << "            [\r][\n]"
21:57:41.425 [main] DEBUG org.apache.http.wire - << "            [\r][\n]"
21:57:41.433 [main] DEBUG org.apache.http.wire - << "        </ul>[\n]"
21:57:41.433 [main] DEBUG org.apache.http.wire - << "</div>[\n]"
21:57:41.433 [main] DEBUG org.apache.http.wire - << "[\n]"
21:57:41.433 [main] DEBUG org.apache.http.wire - << "</div>[\n]"
21:57:41.433 [main] DEBUG org.apache.http.wire - << "[\n]"
21:57:41.433 [main] DEBUG org.apache.http.wire - << "[\n]"
21:57:41.433 [main] DEBUG org.apache.http.wire - << "[\n]"
21:57:41.433 [main] DEBUG org.apache.http.wire - << "[\n]"
21:57:41.433 [main] DEBUG org.apache.http.wire - << "<div class="details">[\n]"
21:57:41.442 [main] DEBUG org.apache.http.wire - << "[\n]"
21:57:41.443 [main] DEBUG org.apache.http.wire - << "[\n]"
21:57:41.443 [main] DEBUG org.apache.http.wire - << "<div class="details-body details-precis  ">[\n]
"
21:57:41.443 [main] DEBUG org.apache.http.wire - << "<div class="details-state">[\n]"
21:57:41.443 [main] DEBUG org.apache.http.wire - << "[\n]"
21:57:41.443 [main] DEBUG org.apache.http.wire - << "</div>[\n]"
21:57:41.443 [main] DEBUG org.apache.http.wire - << "</div>[\n]"
21:57:41.443 [main] DEBUG org.apache.http.wire - << "[\n]"
21:57:41.455 [main] DEBUG org.apache.http.wire - << "[\n]"
21:57:41.455 [main] DEBUG org.apache.http.wire - << "</div>[\n]"
21:57:41.455 [main] DEBUG org.apache.http.wire - << "[\n]"
21:57:41.455 [main] DEBUG org.apache.http.wire - << "</div>[\n]"
21:57:41.455 [main] DEBUG org.apache.http.wire - << "</div>[\n]"
21:57:41.455 [main] DEBUG org.apache.http.wire - << "[\n]"
21:57:41.455 [main] DEBUG org.apache.http.wire - << "[\n]"
21:57:41.455 [main] DEBUG org.apache.http.wire - << "[\n]"
21:57:41.455 [main] DEBUG org.apache.http.wire - << "[\r][\n]"
Destroying 1 processes21:57:41.465 [main] DEBUG org.apache.http.wire - << "[\r][\n]"

तार में आने वाली हर चीज के लिए यह आउटपुट इस लाइब्रेरी को मेरे लिए उपयोग करने योग्य बना रहा है ... यह तब तक है जब तक कि मैं इसे कैसे बंद कर सकता हूं। क्या इस लॉग कॉन्फ़िगरेशन को पढ़ने के लिए मुझे कुछ खास करने की ज़रूरत है?


Log4j प्रॉपर्टी फ़ाइल में नीचे दी गई पंक्तियां जोड़ें और यह http लॉग बंद कर देगा: - log4j.logger.org.apache.http = OFF


आपके log4.properties में - क्या आपके पास यह सेट है जैसा कि मैंने नीचे किया है और फ़ाइल में सेट कोई अन्य org.apache.http लॉगर्स नहीं है?

-org.apache.commons.logging.simplelog.log.org.apache.http=ERROR

अगर आपके पास log4j गुण फ़ाइल में log4j.rootLogger लिए निर्दिष्ट कोई लॉग स्तर नहीं है, तो यह log4j.rootLogger स्तर का उत्तराधिकारी होगा। तो अगर आपके पास log4j.rootLogger तो हम आपके लॉग 4j.properties में org.apache.http सेटिंग्स को log4j.rootLogger सेट करें और इसे केवल विरासत द्वारा केवल ERROR संदेशों को लॉग इन करना चाहिए।

अद्यतन करें:

एक commons-logging.properties फ़ाइल बनाएं और इसमें निम्न पंक्ति जोड़ें। यह भी सुनिश्चित करें कि यह फ़ाइल आपके क्लासस्पैट में है।

org.apache.commons.logging.LogFactory = org.apache.commons.logging.impl.Log4jFactory

एक पूर्ण लॉग 4j फ़ाइल और ओपी के लिए इसे आमंत्रित करने के लिए कोड जोड़ा गया। यह log4j.properties आपके क्लासस्पैट में होना चाहिए। मैं इस पल के लिए stdout मान रहा हूँ।

log4j.configuration=log4j.properties 
log4j.rootLogger=ERROR, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%c] %m%n

log4j.logger.org.apache.http=ERROR

यहां कुछ कोड है जो आपको लॉगर को आमंत्रित करने के लिए अपनी कक्षा में जोड़ने की आवश्यकता है।

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; 

public class MyClazz
{
    private Log log = LogFactory.getLog(MyClazz.class);
    //your code for the class
}

इसी समस्या के समाधान के लिए खोज करते समय मुझे इस पोस्ट का नेतृत्व किया गया। टिम का जवाब बहुत उपयोगी था। मैट बेकर की तरह, मैं बहुत अधिक कॉन्फ़िगरेशन के बिना httpClient लॉग को बंद करना चाहता हूं। चूंकि हमें यकीन नहीं था कि आम-लॉगिंग के नीचे कौन सा लॉगिंग कार्यान्वयन किया गया था, मेरा समाधान क्लास पथ में log4j jar फ़ाइल फेंककर log4j का उपयोग करके इसे मजबूर करना था। Log4j कॉन्फ़िगरेशन की डिफ़ॉल्ट सेटिंग सामान्य-httpclient डीबग आउटपुट बंद कर देती है। बेशक, इसे और अधिक मजबूत बनाने के लिए, आप अपनी लॉगिंग कॉन्फ़िगरेशन को और परिभाषित करने के लिए सामान्य-logging.properties और log4j.properties फ़ाइलों को बना सकते हैं।


कॉमन्स-लॉगिंग को पूरी तरह से इस्तेमाल होने से रोकने के लिए मैंने पाया सबसे अच्छा समाधान मैवेन एनफोर्स प्लगइन का उपयोग करना था। फिर मैंने लॉगिंग के लिए slf4j निर्भरता को जोड़ा। तो अपने pom.xml में निम्नलिखित जोड़ें

<dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>[your version here]</version>
    </dependency>

और मेवेन-एनफोर्स प्लगइन भी जोड़ें

<plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-enforcer-plugin</artifactId>
           <version>[your version here]</version>
           <executions>
               <execution>
                   <id>enforce</id>
                   <configuration>
                       <rules>
                           <DependencyConvergence />
                           <bannedDependencies>
                               <excludes>
                                   <exclude>commons-logging:commons-logging</exclude>
                               </excludes>
                           </bannedDependencies>
                       </rules>
                   </configuration>
                   <goals>
                       <goal>enforce</goal>
                   </goals>
               </execution>
           </executions>
       </plugin>

डालने का प्रयास करें

org.apache.commons.logging.Log=org.apache.commons.logging.impl.NoOpLog

आपके commons-logging.properties में


मुझे JWebUnit के साथ एक ही समस्या थी। कृपया ध्यान दें कि यदि आप बाइनरी वितरण का उपयोग करते हैं तो लॉगबैक एक डिफ़ॉल्ट लॉगर है। JWebUnit के साथ log4j का उपयोग करने के लिए मैंने निम्न चरणों का पालन किया:

  • लॉगबैक जार हटा दिया
  • sfl4j के लिए lod4j पुल लाइब्रेरी जोड़ें - slf4j-log4j12-1.6.4.jar
  • log4j.properties जोड़ें

शायद आपको लॉगबैक जार को हटाने की ज़रूरत नहीं है लेकिन log4j का उपयोग करने के लिए आपको slf4j को मजबूर करने के लिए कुछ अतिरिक्त कदम की आवश्यकता होगी


मुझे अपने बाकी टेम्पलेट के लिए HttpComponentsClientHttpRequestFactory सेट करने के बाद ऐसी समस्या का अनुभव हुआ।

OkHttpClientHttpRequestFactory को सेट करना कचरा लॉगिंग के साथ समस्या हल करना चाहिए।


मैंने इसे अपनी log4j कॉन्फ़िगरेशन फ़ाइल में रखा है

log4j.logger.org.apache.http.wire=WARN

यह आउटपुट को चेतावनी स्तर या ऊपर तक सीमित करता है


यह मुझे एक बार पता लगाने के लिए उम्र ले गया, आपको इसकी आवश्यकता है:

log4j.logger.httpclient.wire=ERROR

मुझे लगता है कि HttpClient "httpclient.wire" को इसके लॉगर नाम के रूप में उपयोग करता है, न कि "org.apache.commons.httpclient"।

स्नीकी बगर्स


सरल तरीका Log4j और HttpCLient (v3.1 इस मामले में, उच्च के लिए काम करना चाहिए, मामूली परिवर्तन की आवश्यकता हो सकती है)

सुनिश्चित करें कि सभी निर्भरताएं सही हैं, और एमडी 5 आपके डाउनलोड !!!!

import org.apache.commons.httpclient.HttpClient;  
import org.apache.log4j.Level;  
import org.apache.log4j.Logger;  

---

Logger.getLogger("org.apache.commons.httpclient").setLevel(Level.WARN);
Logger.getLogger("httpclient.wire.header").setLevel(Level.WARN);
Logger.getLogger("httpclient.wire.content").setLevel(Level.WARN);

HttpClient client = new HttpClient();

हम अपने लॉगिंग आउटपुट को कॉन्फ़िगर करने के लिए, गुण फ़ाइल के बजाय एक्सएमएल का उपयोग करते हैं। निम्नलिखित कोड इस चापलूसी चुप करने के लिए काम किया।

<logger name="org.apache.commons.httpclient">
    <level value="fatal"/>
</logger>

<logger name="httpclient.wire.header">
    <level value="fatal"/>
</logger>

<logger name="httpclient.wire.content">
    <level value="fatal"/>
</logger>

log4j.properties लिए, log4j.properties (अनुप्रयोग की source निर्देशिका में) में निम्न जोड़ें:

log4j.logger.org.apache=WARN
log4j.logger.httpclient=WARN

लॉगबैक के लिए, निम्न logback.xml शोर को मार देगा:

<configuration>
    <logger name="org.apache" level="WARN" />
    <logger name="httpclient" level="WARN" /> 
</configuration>

नोट: इनमें से कुछ उत्तर उन चीजों को दोहरा सकते हैं जिन्हें आप पहले से जानते हैं (या आपको लगता है), लेकिन इस प्रश्न पर चारों ओर गलत जानकारी दी गई है, इसलिए मैं शुरुआत में शुरुआत करने जा रहा हूं और इसे सब कुछ बताऊंगा

  • कॉमन्स एचटीपी क्लाइंट अपनी सभी लॉगिंग आवश्यकताओं के लिए कॉमन्स-लॉगिंग का उपयोग करता है।
  • कॉमन्स-लॉगिंग एक पूर्ण लॉगिंग फ्रेमवर्क नहीं है, बल्कि, कई मौजूदा लॉगिंग फ्रेमवर्क के आसपास एक रैपर है
  • इसका अर्थ यह है कि जब आप लॉगिंग आउटपुट को नियंत्रित करना चाहते हैं, तो आप (ज्यादातर) कॉमन्स-लॉगिंग के अलावा लाइब्रेरी को कॉन्फ़िगर करना समाप्त कर देते हैं, लेकिन क्योंकि कॉमन्स-लॉगिंग कई अन्य पुस्तकालयों के आसपास लपेटता है, यह जानना मुश्किल है कि कौन सी जाने बिना कॉन्फ़िगर किया जाए आपका बिल्कुल सेटअप
  • Commons-Logging log4j पर लॉग इन कर सकता है, लेकिन यह java.util.logging (JDK1.4 लॉगिंग) पर लॉग भी कर सकता है
  • कॉमन्स-लॉगिंग स्मार्ट होने का अनुमान लगाती है और अनुमान लगाती है कि आप किस लॉगिंग फ्रेमवर्क का उपयोग कर रहे हैं, और इसके लॉग भेज सकते हैं।
  • यदि आपके पास पहले से लॉगिंग फ्रेमवर्क नहीं है, और जेआरई पर चल रहा है जो कि 1.4 या उससे ऊपर है (जो आपको वास्तव में होना चाहिए) तो यह संभवतः जेडीके लॉगिंग ( java.util.logging ) पर अपने लॉग संदेश भेज रहा होगा।
  • कॉमन्स-लॉगिंग की ऑटोोडिसवरी तंत्र पर निर्भर करना त्रुटि के लिए प्रवण है। बस log4j.jar पर log4j.jar जोड़ना यह लॉगिंग तंत्र को स्विच करने का कारण बनता है, जो शायद आप नहीं चाहते हैं
  • यह आपके लिए कॉमन्स-लॉगिंग को स्पष्ट रूप से बताने के लिए बेहतर है जो पुस्तकालय का उपयोग करने के लिए लॉगिंग करता है
  • आप इन निर्देशों के अनुसार commons-logging.properties फ़ाइल बनाकर ऐसा कर सकते हैं
  • कॉमन्स-httpclient लॉगिंग को कॉन्फ़िगर करने के लिए आप जिन चरणों का पालन करना चाहते हैं वे हैं
    1. तय करें कि आप किस अंतर्निहित लॉगिंग ढांचे का उपयोग करना चाहते हैं। कई विकल्प हैं, लेकिन शायद log4j या java.util.logging आपके लिए सबसे अच्छे विकल्प हैं।
    2. सही Log कार्यान्वयन को इंगित करने के लिए कॉमन्स-लॉगिंग गुण फ़ाइल सेट अप करें। उदाहरण के लिए log4j का उपयोग करने के लिए, इसे गुण फ़ाइल में रखें: org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger , या org.apache.commons.logging.Log=org.apache.commons.logging.impl.Jdk14Logger लॉगिंग सेट org.apache.commons.logging.Log=org.apache.commons.logging.impl.Jdk14Logger । इन्हें सिस्टम गुणों के रूप में भी सेट किया जा सकता है (उदाहरण के लिए कमांड लाइन पर- -D का उपयोग करना)।
    3. उन संदेशों को अनदेखा करने के लिए अंतर्निहित लॉगिंग कार्यान्वयन (जैसे log4j) को कॉन्फ़िगर करें, और जो संदेश आप चाहते हैं उन्हें आउटपुट करें।

यह बहुत सारे कदम हैं, लेकिन यही वह है। अपाचे-कॉमन्स के डेवलपर्स मानते हैं कि आपके पास पहले से ही लॉगिंग फ्रेमवर्क कॉन्फ़िगर किया जाएगा, और वे ऑटो-डिस्कवरी द्वारा कौन सा काम कर सकते हैं।
यदि यह आपके लिए सच नहीं है, तो यह चीजें चलाने के लिए थोड़ा और काम होता है।







jwebunit