ปิดใช้งานการบันทึก HttpClient


138

ฉันใช้ commons-httpclient 3.1 ในชุดทดสอบการรวม การบันทึกเริ่มต้นสำหรับ HttpClient มีเสียงดังมากและดูเหมือนว่าฉันจะปิดไม่ได้ ฉันได้ลองทำตามคำแนะนำที่นี่แล้วแต่ก็ไม่มีข้อแตกต่างใด ๆ

ส่วนใหญ่ฉันแค่ต้องทำให้ org.apache.http.wire logger ปิด ปัญหาส่วนหนึ่งคือฉันไม่รู้ว่า HttpClient กำลังพยายามใช้ตัวบันทึกประเภทใดและปัญหาส่วนใหญ่คือฉันไม่เคยใช้ไลบรารีนี้มาก่อน ฉันลองสร้างไฟล์ log4j.properties และวางลงในโฟลเดอร์ test / resources ของฉันแก้ไขไฟล์ master logging.properties ใน jre / lib และส่งอ็อพชันการบันทึกต่างๆไปยัง Maven ตามที่ระบุไว้ในเพจการบันทึกและไม่มีเลย สร้างความแตกต่าง

ขอความช่วยเหลือใด ๆ ... นี่ทำให้ฉันรู้สึกแย่

UPDATE:การแก้ไข: ดูเหมือนว่าผลลัพธ์ที่เป็นปัญหานั้นมาจากการใช้งาน HttpClient ของ jwebunit ไม่ใช่ของฉันเอง ยังไงก็ไม่ถูกใจ

อัปเดต:ขอบคุณสำหรับความพยายามที่ผ่านมา ฉันลองทุกอย่างที่แนะนำด้านล่างแล้ว แต่ยังไม่มีโชค ฉันมีไฟล์ commons-logging.properties ในโฟลเดอร์ src / test / resources ที่มีเนื้อหาต่อไปนี้

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]"

ผลลัพธ์นี้สำหรับทุกสิ่งที่อยู่บนเส้นลวดทำให้ไลบรารีนี้ใช้ไม่ได้สำหรับฉัน ... นั่นคือจนกว่าฉันจะหาวิธีปิดได้ มีอะไรพิเศษที่ฉันต้องทำเพื่อให้สามารถอ่านการกำหนดค่าบันทึกนี้ได้หรือไม่


สำหรับทุกคนที่เจอปัญหานี้: อย่าลืมเพิ่ม-Dlog4j.debugตัวเลือก VM ของคุณเพื่อให้แน่ใจว่าไฟล์กำหนดค่าถูกโหลด
Tommy

3
ดูstackoverflow.com/questions/1436761/... ตัดตอนมา: public class Main { static { System.setProperty("org.apache.commons.logging.Log", "org.apache.commons.logging.impl.NoOpLog"); } // Rest of class as before }
PVS

1
เอกสารอย่างเป็นทางการ: hc.apache.org/httpclient-3.x/logging.html
Christophe Roussy

3
สิ่งนี้เคยได้รับการแก้ไขสำหรับ OP. ปัญหาที่แน่นอนนี้กำลังฆ่าฉัน
Collin Bell

2
นี่คือการแก้ไข? พยายามจัดสรรคำตอบไม่มีโชค
Markvds

คำตอบ:


87

อัปเดต log4j.propertiesเพื่อรวม:

log4j.logger.httpclient.wire.header=WARN
log4j.logger.httpclient.wire.content=WARN

โปรดทราบว่าหากไม่ได้ติดตั้งไลบรารี Log4j HttpClient (และดังนั้น JWebUnit) จะใช้การบันทึกกลับ ในสถานการณ์นี้ให้สร้างหรือแก้ไขlogback.xmlเพื่อรวม:

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

การตั้งค่าระดับการบันทึกเป็นWARNLog4j โดยใช้ชื่อแพ็กเกจorg.apache.commons.httpclientในlog4j.properties จะไม่ทำงานตามที่คาดไว้:

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

เนื่องจากแหล่งที่มาของ HttpClient (v3.1) ใช้ชื่อบันทึกต่อไปนี้:

public static Wire HEADER_WIRE = new Wire(LogFactory.getLog("httpclient.wire.header"));
public static Wire CONTENT_WIRE = new Wire(LogFactory.getLog("httpclient.wire.content"));

21
ในซอร์ส 4.2.1 ชื่อบันทึกคือ: "org.apache.http.headers" และ "org.apache.http.wire" แม้ว่าจะใช้การบันทึก apache ที่มีเสียงดังดูเหมือนจะไม่ปิดสำหรับฉัน .
Tinclon

ขอบคุณ!!! นอกจากนี้: หากคุณมีปัญหานี้อยู่ที่ไหนสักแห่งในรหัสของคุณเองซึ่งคุณใช้ httpclient และยังไม่ได้ใช้ Log4j: อย่าลืมรวม jar log4j ไว้ใน classpath ด้วย ...
FelixD

30

หมายเหตุ: คำตอบนี้บางคำอาจทำซ้ำสิ่งที่คุณรู้อยู่แล้ว (หรือคิดว่าคุณรู้) แต่มีข้อมูลที่ผิดพลาดอยู่เล็กน้อยในคำถามนี้ดังนั้นฉันจะเริ่มที่จุดเริ่มต้นและสะกดคำทั้งหมด

  • Commons HttpClient ใช้ Commons-Logging สำหรับทุกความต้องการในการบันทึก
  • Commons-Logging ไม่ใช่เฟรมเวิร์กการบันทึกแบบเต็ม แต่เป็น wrapper รอบ ๆ เฟรมเวิร์กการบันทึกที่มีอยู่มากมาย
  • นั่นหมายความว่าเมื่อคุณต้องการควบคุมเอาต์พุตการบันทึกคุณ (ส่วนใหญ่) จะสิ้นสุดการกำหนดค่าไลบรารีอื่นที่ไม่ใช่ Commons-Logging แต่เนื่องจาก Commons-Logging ล้อมรอบไลบรารีอื่น ๆ หลายไลบรารีจึงยากที่เราจะเดาได้ว่าจะกำหนดค่าใดโดยไม่รู้ การตั้งค่าที่แน่นอนของคุณ
  • Commons-Logging สามารถเข้าสู่ log4j ได้ แต่ยังสามารถเข้าสู่ระบบได้ java.util.logging (การบันทึก JDK1.4)
  • Commons-Logging พยายามที่จะฉลาดและคาดเดากรอบการบันทึกที่คุณใช้อยู่แล้วและส่งบันทึกของมันไปที่นั้น
  • หากคุณยังไม่มีเฟรมเวิร์กการบันทึกและกำลังทำงานบน JRE ที่ 1.4 ขึ้นไป (ซึ่งคุณควรจะเป็น) มันอาจจะส่งข้อความบันทึกไปยังการบันทึก JDK ( java.util.logging)
  • การอาศัยกลไกการค้นหาอัตโนมัติของ Commons-Logging มีแนวโน้มที่จะเกิดข้อผิดพลาด เพียงแค่เพิ่มlog4j.jarลงใน classpath ก็จะทำให้กลไกการบันทึกเปลี่ยนไปใช้ซึ่งอาจไม่ใช่สิ่งที่คุณต้องการ
  • ขอแนะนำให้คุณบอก Commons-Logging อย่างชัดเจนว่าควรใช้ไลบรารีการบันทึกใด
  • คุณสามารถทำได้โดยสร้างcommons-logging.propertiesไฟล์ตามคำแนะนำเหล่านี้
  • ขั้นตอนที่คุณต้องการทำตามเพื่อกำหนดค่าการบันทึกแบบคอมมอนส์ - httpclient คือ
    1. ตัดสินใจว่าคุณต้องการใช้เฟรมเวิร์กการบันทึกพื้นฐานใด มีหลายทางเลือก แต่อาจเป็นlog4jหรือjava.util.loggingเป็นตัวเลือกที่ดีที่สุดสำหรับคุณ
    2. ตั้งค่าไฟล์คุณสมบัติการบันทึกคอมมอนส์เพื่อชี้ไปที่Logการนำไปใช้งานที่ถูกต้อง เช่นการใช้ log4j ใส่นี้ลงในแฟ้มคุณสมบัติ: org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLoggerหรือจะใช้ JDK org.apache.commons.logging.Log=org.apache.commons.logging.impl.Jdk14Loggerชุดการเข้าสู่ระบบ นอกจากนี้ยังสามารถตั้งค่าเป็นคุณสมบัติของระบบได้ (เช่นใช้-Dในบรรทัดคำสั่ง)
    3. กำหนดค่าการใช้งานการบันทึกพื้นฐาน (เช่น log4j) เพื่อละเว้นข้อความที่คุณไม่ต้องการและส่งออกข้อความที่คุณต้องการ

มีขั้นตอนมากมาย แต่นั่นคือสิ่งที่ต้องทำ นักพัฒนาที่ Apache-commons มักจะคิดว่าคุณมีกรอบการบันทึกที่กำหนดค่าไว้แล้วและพวกเขาสามารถระบุได้ว่าเป็นกรอบการค้นหาอัตโนมัติ
หากนั่นไม่เป็นความจริงสำหรับคุณก็มีแนวโน้มที่จะต้องทำงานอีกเล็กน้อยเพื่อให้สิ่งต่างๆดำเนินไป


1
นี่เป็นข้อมูลที่มีประโยชน์มาก ฉันรู้สึกว่าควรเพิ่มในหน้านี้จริงๆ คุณเขียนไว้แค่นี้เองเหรอ?
natem345

1
ผู้ชายคำตอบนี้ดีมาก แต่ฉันล้มเหลวในการทำให้มันได้ผล ฉันใช้ Dropwizard และฉันได้ลองทุกอย่างที่คุณพูดถึงแล้ว แต่ก็ไม่มีประโยชน์: '(
Vic Seedoubleyew

19

ฉันใส่สิ่งนี้ลงในไฟล์ config log4j ของฉัน

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

ซึ่งจะ จำกัด เอาต์พุตไว้ที่ระดับคำเตือนขึ้นไป


19

สิ่งนี้ใช้ได้กับการทดสอบของฉัน

java.util.logging.Logger.getLogger("org.apache.http.wire").setLevel(java.util.logging.Level.FINEST);
java.util.logging.Logger.getLogger("org.apache.http.headers").setLevel(java.util.logging.Level.FINEST);
System.setProperty("org.apache.commons.logging.Log", "org.apache.commons.logging.impl.SimpleLog");
System.setProperty("org.apache.commons.logging.simplelog.showdatetime", "true");
System.setProperty("org.apache.commons.logging.simplelog.log.httpclient.wire", "ERROR");
System.setProperty("org.apache.commons.logging.simplelog.log.org.apache.http", "ERROR");
System.setProperty("org.apache.commons.logging.simplelog.log.org.apache.http.headers", "ERROR");

19

สำหรับ log4j ให้เพิ่มสิ่งต่อไปนี้ใน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>

1
ฉันใช้ log4j การเพิ่มสองบรรทัดแรกในตัวแก้ไขบันทึกปัญหาของฉันอย่างสมบูรณ์ ข้อความบันทึกอื่น ๆ ของฉันทั้งหมดจะปรากฏตามระดับที่ฉันตั้งไว้ ในขณะที่บันทึก apache ไม่มี ความช่วยเหลือที่ดี ขอบคุณ.
Arun Thundyill Saseendran

อาจแตกต่างกันไปขึ้นอยู่กับสถานการณ์ของคุณ แต่สำหรับการปิดใช้งานการบันทึกแบบละเอียดมากที่เปิดใช้งานนอกกรอบด้วย AWS SDK นี่เป็นสิ่งเดียวที่ใช้ได้ผล
Matt Baker

สั้นและไพเราะและใช้งานได้อย่างไม่มีที่ติ
Ajay Kumar

11

มันต้องใช้เวลานานเกินไปที่จะหานี้ แต่ JWebUnit มาพร้อมกับLogbackองค์ประกอบการเข้าสู่ระบบจึงจะไม่ได้ใช้หรือlog4j.propertiescommons-logging.properties

ให้สร้างไฟล์ที่เรียกว่าlogback.xmlและวางไว้ในโฟลเดอร์ซอร์สโค้ดของคุณแทน (ในกรณีของฉันsrc):

<configuration debug="false">
  <!-- definition of appender STDOUT -->
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern>
    </encoder>
  </appender>

  <root level="ERROR">
    <!-- appender referenced after it is defined -->
    <appender-ref ref="STDOUT"/>
  </root> 
</configuration>

Logback ดูเหมือนจะยังอยู่ระหว่างการพัฒนาและดูเหมือนว่า API จะยังคงมีการเปลี่ยนแปลงดังนั้นตัวอย่างโค้ดนี้อาจล้มเหลวในอนาคต ดูคำถาม StackOverflow นี้ด้วย


1
คุณสวย. ฉันเกือบจะฆ่าแมวเพราะเจ้าสิ่งนี้ มันทำให้ฉันบ้า
Manish Patel

นี่เป็นทางออกสำหรับฉัน ฉันคิดว่ามันเป็นเพราะไลบรารีอื่น ๆ ที่ฉันรวมการล็อกแบ็กแบบสกรรมกริยาดังนั้นมันจึงถูกล็อกเข้าสู่คนตัดไม้
Nathan

11

ฉันมีปัญหานี้ขณะใช้ RestAssured กับ JUnit สำหรับฉันวิธีการแบบเป็นโปรแกรมนี้ใช้ได้ผล:

@BeforeClass
public static void setUpClass() {
    ch.qos.logback.classic.Logger root = (ch.qos.logback.classic.Logger) org.slf4j.LoggerFactory.getLogger("org.apache.http");
    root.setLevel(ch.qos.logback.classic.Level.INFO);

    //...
}

3
เยี่ยมมากทางออกเดียวที่ใช้ได้ผลสำหรับฉัน ขอบคุณมาก.
lasote

ขอบคุณ! ใช้รหัสเดียวกันในตอนเริ่มต้นของวิธีการทดสอบไม่ได้ทำอะไรเลย วางไว้ในตัวเอง@Beforeหรือ@BeforeClassใช้งานได้อย่างสวยงาม
ExactaBox

8

เราใช้ XML แทนที่จะเป็นไฟล์คุณสมบัติเพื่อกำหนดค่าเอาต์พุตการบันทึกของเรา รหัสต่อไปนี้ใช้เพื่อปิดเสียงพูดพล่อยนี้

<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>

5

ฉันได้รับผลกระทบจากปัญหาเดียวกันมาระยะหนึ่งแล้วและในที่สุดก็ตัดสินใจที่จะตรวจสอบเรื่องนี้ ปรากฎว่าปัญหาคือโครงการของฉันมีการพึ่งพา http-builder-0.5.2.jar ซึ่งรวมไฟล์ log4j.xml ไว้ภายในตัวเอง และแน่นอนว่าระดับบันทึกสำหรับ org.apache.http.wire คือ DEBUG! วิธีที่ฉันพบก็แค่ไปที่ไฟล์ jar ทั้งหมดในการอ้างอิงของฉันและทำ "jar tvf" และ grepping สำหรับ log4j

ในขณะที่การค้นพบนี้นำไปสู่การแก้ปัญหาในท้ายที่สุดของการเพิ่มเวอร์ชันของการอ้างอิง http-builder ของฉันเป็น 0.6 แต่ก็ยังทำให้ฉันงงงวยว่าสิ่งที่ต้องทำในใจของนักพัฒนาเมื่อรวมไฟล์ log4j.xml ลงในไฟล์ jar อย่างไรก็ตามตอนนี้อาจไม่เกี่ยวข้องกับเธรดนี้ แต่ฉันคิดว่ามันมีประโยชน์ที่จะพูดถึงวิธีแก้ปัญหานี้ฉันพบว่าเมื่อฉันค้นหาวิธีแก้ปัญหาก่อนหน้านี้ฉันไม่เคยคิดขึ้นมา หวังว่าจะมีคนพบว่าสิ่งนี้มีประโยชน์


<!-- https://mvnrepository.com/artifact/com.fredericboisguerin.excel/excel-reader-writer --> <dependency> <groupId>com.fredericboisguerin.excel</groupId> <artifactId>excel-reader-writer</artifactId> <version>2.1</version> </dependency>ปัญหาที่คล้ายกันในขณะที่ใช้ ลบการอ้างอิงและบันทึกหายไป ขอบคุณ!
adom

4

ใน log4.properties ของคุณ - คุณมีชุดนี้เหมือนที่ฉันทำด้านล่างและไม่ได้org.apache.httpตั้งค่าตัวบันทึกอื่น ๆในไฟล์หรือ

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

นอกจากนี้หากคุณไม่มีระดับการบันทึกที่ระบุไว้org.apache.httpในไฟล์คุณสมบัติ log4j ของคุณระดับนั้นจะสืบทอด log4j.rootLoggerระดับ ดังนั้นหากคุณlog4j.rootLoggerตั้งค่าให้สมมติว่า ERROR และนำorg.apache.httpการตั้งค่าออกใน log4j.properties ของคุณซึ่งควรทำให้เป็นเพียงERRORข้อความบันทึกโดยการสืบทอดเท่านั้น

อัพเดท:

สร้างcommons-logging.propertiesไฟล์และเพิ่มบรรทัดต่อไปนี้ ตรวจสอบให้แน่ใจว่าไฟล์นี้อยู่ใน CLASSPATH ของคุณ

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

เพิ่มไฟล์ log4j ที่สมบูรณ์และรหัสเพื่อเรียกใช้สำหรับ OP log4j.properties นี้ควรอยู่ใน CLASSPATH ของคุณ ตอนนี้ฉันกำลังทะลึ่งตึงตัง

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
}

ฉันไม่ต้องการไฟล์ log4j.properties ก่อนที่จะพยายามใช้ HttpClient ฉันลองใส่บรรทัดของคุณในไฟล์ src / test / resources / log4j.properties แล้ว แต่ก็ไม่ได้สร้างความแตกต่าง การใส่อ็อพชัน commons.logging ใน log4j.properties ถูกต้องหรือไม่
Matt Baker

ใช่การบันทึกคอมมอนส์เป็นเพียงเครื่องห่อหุ้มรอบ log4j คุณเรียกคนตัดไม้ในชั้นเรียนทดสอบของคุณได้อย่างไร?
CoolBeans

(หลังจากการอัปเดตของคุณ) ฉันทำเพื่อให้บรรทัดด้านบนเป็นเพียงบรรทัดเดียวในไฟล์ log4j.properties ของฉันและมันยังคงคายทุกอย่าง
Matt Baker

1
ฉันไม่เรียกคนตัดไม้ HttpClient ทำด้วยตัวเอง
Matt Baker

ในลิงค์ที่คุณระบุว่า - "หมายเหตุ: Log4j ไม่รวมอยู่ในการแจกจ่าย HttpClient" ดังนั้นคุณต้องเพิ่มลงใน CLASSPATH ของคุณอย่างแน่นอน คุณเห็นผลลัพธ์ใน stdout (คอนโซล) หรือในล็อกไฟล์หรือไม่? ฉันจะสร้างไฟล์ log4h ตัวอย่างพร้อมรหัสเพื่อเรียกใช้ให้คุณ
CoolBeans

4

วิธีง่ายๆ Log4j และ HttpCLient (v3.1 ในกรณีนี้ควรทำงานให้สูงขึ้นอาจต้องมีการเปลี่ยนแปลงเล็กน้อย)

ตรวจสอบให้แน่ใจว่าการอ้างอิงทั้งหมดถูกต้องและ MD5 การดาวน์โหลดของคุณ !!!!

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();

ควรวางตามmainวิธีการหรือไม่?
พาร์เซกเกอร์

@parsecer คุณสามารถ
WiR3D

3

ฉันมีปัญหาเดียวกันกับ JWebUnit โปรดสังเกตว่าหากคุณใช้การแจกแจงแบบไบนารี Logback จะเป็นตัวบันทึกเริ่มต้น ในการใช้ log4j กับ JWebUnit ฉันทำตามขั้นตอนต่อไปนี้:

  • ลบ Logback jars
  • เพิ่มไลบรารีสะพาน lod4j สำหรับ sfl4j - slf4j-log4j12-1.6.4.jar
  • เพิ่ม log4j.properties

คุณอาจไม่จำเป็นต้องลบ Logback jars แต่คุณจะต้องมีขั้นตอนเพิ่มเติมเพื่อบังคับให้ slf4j ใช้ log4j


ขอบคุณฉันประสบปัญหาเดียวกันเมื่อใช้ OpenRdf เคล็ดลับอื่น ๆ ทั้งหมดในหัวข้อนี้ดูเหมือนจะไม่มีผลใด ๆ จนกว่าฉันจะถอดไหล็อกแบ็คออกตอนนี้บันทึกเงียบลงอย่างมาก
amarillion

3

2 บรรทัดต่อไปนี้ช่วยแก้ปัญหาของฉันได้อย่างสมบูรณ์:

Logger.getLogger("org.apache.commons.httpclient").setLevel(Level.ERROR);
Logger.getLogger("httpclient").setLevel(Level.ERROR);

สิ่งนี้ได้ผลสำหรับฉันเช่นกัน แต่ฉันไม่ต้องการ: Logger.getLogger ("org.apache.commons.httpclient") setLevel (Level.ERROR);
Jamel Toms

3

เพิ่มบรรทัดด้านล่างในไฟล์คุณสมบัติ log4j และมันจะปิดบันทึก http: - log4j.logger.org.apache.http = OFF


ในการทดสอบหน่วย (ถ้าเป็นหลักจากนั้นใน main) ให้เพิ่ม@BeforeClass public static void BeforeClass() { PropertyConfigurator.configure("log4j.properties"); ...}ไฟล์ log4j.properties ด้วยบรรทัดเดียว log4j.logger.org.apachehttp = OFF ควรอยู่ในรูท (เหนือโฟลเดอร์ src)
Sasha Bond

3

ฉันก็มีปัญหาเดียวกัน คอนโซลทั้งหมดเต็มไปด้วย[main] DEBUG org.apache.http.wireในขณะที่รันการทดสอบ

วิธีแก้ปัญหาที่ใช้ได้ผลสำหรับฉันคือการสร้างlogback-test.xml src / test / resources / logback-test.xmlเช่นเดียวกับในhttps://github.com/bonigarcia/webdrivermanager-examples/blob/master/src/test/resources /logback-test.xml (อ้างอิง - https://github.com/bonigarcia/webdrivermanager/issues/203 )

ในการดูข้อมูลการบันทึกของฉันฉันแทนที่ชื่อคนตัดไม้ = "io.github.bonigarcia" ด้วยชื่อแพ็กเกจของฉัน

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <logger name="com.mypackage" level="DEBUG" />
    <logger name="org" level="INFO" />
    <logger name="com" level="INFO" />

    <root level="INFO">
        <appender-ref ref="STDOUT" />
    </root>

</configuration>

3

มันใช้ได้ผลสำหรับฉันด้วยการเพิ่ม "logback.xml" ในคลาสรูทพา ธ และการตั้งค่าด้านล่าง

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <logger name="org.apache" level="WARN"/>
    <logger name="httpclient" level="WARN"/>
</configuration>

2

ฉันถูกนำไปที่โพสต์นี้เมื่อค้นหาวิธีแก้ปัญหาที่คล้ายกัน คำตอบของทิมมีประโยชน์มาก เช่น Matt Baker ฉันแค่ต้องการปิดบันทึก httpClient โดยไม่ต้องกำหนดค่ามากเกินไป เนื่องจากเราไม่แน่ใจว่าจะใช้การบันทึกแบบใดภายใต้การบันทึกทั่วไปวิธีแก้ปัญหาของฉันคือการบังคับใช้ log4j โดยการโยนไฟล์ jar log4j ในพา ธ คลาส การตั้งค่าเริ่มต้นของคอนฟิกูเรชัน log4j จะปิดเอาต์พุตการดีบักทั่วไป -httpclient แน่นอนเพื่อให้มีประสิทธิภาพมากขึ้นคุณอาจสร้างไฟล์ common-logging.properties และ log4j.properties เพื่อกำหนดการตั้งค่าการบันทึกของคุณเพิ่มเติม




1

ฉันมีปัญหาเดียวกันนี้เมื่อเรียกใช้การทดสอบการรวม 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>

1

สิ่งนี้ทำให้ฉันต้องใช้เวลานานพอสมควรคุณต้องมีสิ่งนี้:

log4j.logger.httpclient.wire=ERROR

ฉันเดาว่า HttpClient ใช้ "httpclient.wire" เป็นชื่อคนตัดไม้ไม่ใช่ "org.apache.commons.httpclient"

บักเกอร์ส่อเสียด


1

สิ่งนี้ได้ผลสำหรับฉัน

System.setProperty("org.apache.commons.logging.Log", "org.apache.commons.logging.impl.SimpleLog");
System.setProperty("org.apache.commons.logging.simplelog.showdatetime", "true");
System.setProperty("org.apache.commons.logging.simplelog.log.httpclient.wire.header", "error");
System.setProperty("org.apache.commons.logging.simplelog.log.org.apache.http", "error");
System.setProperty("log4j.logger.org.apache.http", "error");
System.setProperty("log4j.logger.org.apache.http.wire", "error");
System.setProperty("org.apache.commons.logging.simplelog.log.org.apache.commons.httpclient", "error");

0

ทางออกที่ดีที่สุดที่ฉันพบคือใช้ปลั๊กอิน maven enforcer เพื่อป้องกันไม่ให้ใช้การบันทึกแบบคอมมอนส์พร้อมกัน จากนั้นฉันเพิ่มการพึ่งพา slf4j สำหรับการบันทึกแทน ดังนั้นเพิ่มสิ่งต่อไปนี้ใน pom.xml ของคุณ

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

และยังเพิ่มปลั๊กอิน maven-enforcer

<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>

Failed to execute goal org.apache.maven.plugins:maven-enforcer-plugin:3.0.0-M2:enforce (enforce) on project gs-serving-web-content: Some Enforcer rules have failed. Look above for specific messages explaining why the rule failed
พาร์เซกเกอร์

0

ฉันประสบปัญหาดังกล่าวหลังจากตั้งค่า HttpComponentsClientHttpRequestFactory สำหรับเทมเพลตส่วนที่เหลือของฉัน

การตั้งค่า OkHttpClientHttpRequestFactory ควรแก้ปัญหาเกี่ยวกับการบันทึกถังขยะ


0

เพียงเพิ่มการอ้างอิงทั้งสองนี้ในไฟล์ pom: ฉันได้ลองและประสบความสำเร็จหลังจากลองอภิปรายมาก่อน

<!--Using logback-->
<dependency>
   <groupId>commons-logging</groupId>
   <artifactId>commons-logging</artifactId>
   <version>1.2</version>
</dependency>
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-logging</artifactId>
</dependency>

Commons-Logging -> Logback และข้อมูลเริ่มต้นในขณะที่ Debug จะไม่มีอยู่ คุณสามารถใช้ได้:

private static Logger log = LoggerFactory.getLogger(HuaweiAPI.class);

เพื่อกำหนดข้อมูลที่คุณต้องการบันทึก: เช่น Final Result เช่นนี้ จะมีเฉพาะข้อมูลที่ฉันต้องการบันทึกเท่านั้น


0

ฉันลองใช้วิธีแก้ปัญหาข้างต้นทั้งหมดแล้ว แต่ก็ไม่มีประโยชน์ สิ่งที่ใกล้เคียงที่สุดสำหรับฉันคือคนที่แนะนำให้สร้าง logback.xml ใช้งานได้ แต่ไม่มีอะไรเข้าสู่ระบบ หลังจากเล่นกับ logback.xml แล้วนี่คือสิ่งที่ฉันลงเอยด้วย

<configuration>
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <withJansi>true</withJansi>
    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
    </encoder>
  </appender>
  <root level="INFO">
    <appender-ref ref="STDOUT"/>
  </root>
</configuration>

ตอนนี้ทุกระดับที่ต่ำกว่า DEBUG ได้รับการบันทึกอย่างถูกต้อง


0

ด้วย:

  • Log2J 2 2.11.2
  • HttpClient 4.5.7 (ไคลเอนต์ที่เหลือ elasticsearch 7.0.0)
  • ใช้ไฟล์คุณสมบัติเพื่อกำหนดค่า

หนึ่งสามารถเพิ่ม:

logger.httpclient.name=org.apache.http
logger.httpclient.level=info

ด้วย 'httpclient' ในตัวอย่างข้างต้นเป็นชื่อตรรกะที่คุณเลือก

(ทดสอบบนแอปพลิเคชัน Java 11 OpenFX)


0

ในกรณีของฉันฉันใช้คอนฟิกูเรชัน xml และต่อท้ายไฟล์คอนฟิกูเรชัน

<logger name="org.apache.http">
    <level value="warn"/>
</logger>


0

สำหรับฉันบรรทัดด้านล่างในlog4j.propertiesไฟล์ล้างความยุ่งเหยิงทั้งหมดที่มาจากการบันทึก HttpClient ... Hurray !!! :)

log4j.logger.org.apache.http.headers=ERROR
log4j.logger.org.apache.http.wire=ERROR
log4j.logger.org.apache.http.impl.conn.PoolingHttpClientConnectionManager=ERROR
log4j.logger.org.apache.http.impl.conn.DefaultManagedHttpClientConnection=ERROR
log4j.logger.org.apache.http.conn.ssl.SSLConnectionSocketFactory=ERROR
log4j.logger.org.springframework.web.client.RestTemplate=ERROR
log4j.logger.org.apache.http.client.protocol.RequestAddCookies=ERROR
log4j.logger.org.apache.http.client.protocol.RequestAuthCache=ERROR
log4j.logger.org.apache.http.impl.execchain.MainClientExec=ERROR
log4j.logger.org.apache.http.impl.conn.DefaultHttpClientConnectionOperator=ERROR
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.