[java] HttpClient 로깅 비활성화

통합 테스트 스위트에서 commons-httpclient 3.1을 사용하고 있습니다. HttpClient의 기본 로깅은 매우 시끄 럽기 때문에 끌 수없는 것 같습니다. 나는 여기 의 지시를 따르려고 노력했지만 그들 중 어느 것도 차이를 만들지 않습니다.

주로 org.apache.http.wire 로거를 종료해야합니다. 문제의 일부는 어떤 유형의 로거 HttpClient가 사용하려고하는지 모르며 대부분의 문제는 이전 에이 라이브러리를 사용한 적이 없다는 것입니다. log4j.properties 파일을 작성하여 test / resources 폴더에 삭제하고 jre / lib의 master logging.properties 파일을 수정 한 후 logging 페이지 에 지정된대로 다양한 로깅 옵션을 Maven에 전송하려고 시도했지만 그중 아무것도 없습니다. 차이를 만드십시오.

도움이 필요합니다 … 이것은 나를 미치게합니다.

업데이트 : 수정 : 문제의 출력이 실제로 내 자신이 아닌 HttpClient의 jwebunit 사용을 통해 발생하는 것으로 보입니다. 어느 쪽이든 바람직하지 않습니다.

업데이트 : 지금까지 시도해 주셔서 감사합니다. 아래 제안 된 모든 것을 시도했지만 여전히 운이 없습니다. src / test / resources 폴더에 다음 내용의 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.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>

WARN패키지 이름 org.apache.commons.httpclient을 사용하여 Log4j를 사용하여 로그 수준을 설정하면 예상대로 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"));


답변

참고 :이 답변 중 일부는 이미 알고 있거나 알고 있다고 생각하는 것을 반복 할 수 있지만이 질문에 약간의 잘못된 정보가 떠 있기 때문에 처음부터 시작하여 철자를 씁니다.

  • Commons HttpClient는 모든 로깅 요구에 Commons-Logging을 사용합니다.
  • Commons-Logging은 전체 로깅 프레임 워크가 아니라 여러 기존 로깅 프레임 워크를 둘러싼 래퍼입니다.
  • 즉, 로깅 출력을 제어하려는 경우 (주로) Commons-Logging 이외의 라이브러리를 구성하게 되지만 Commons-Logging은 여러 다른 라이브러리를 감싸기 때문에 알지 못하고 구성 할 라이브러리를 추측하기가 어렵습니다. 정확하게 설정하십시오.
  • Commons-Logging은 log4j에 기록 할 수 있지만, 기록 할 수도 있습니다 java.util.logging(JDK1.4 기록).
  • Commons-Logging은 현명하고 이미 사용중인 로깅 프레임 워크를 추측하여 로그를 보냅니다.
  • 로깅 프레임 워크가없고 1.4 이상인 JRE (실제로 있어야 함)에서 실행중인 경우 로그 메시지를 JDK 로깅 ( java.util.logging)으로 전송합니다.
  • Commons-Logging의 자동 검색 메커니즘에 의존하면 오류가 발생하기 쉽습니다. 단순히 log4j.jar클래스 경로에 추가 하면 사용하는 로깅 메커니즘을 전환 할 수 있습니다.
  • 어떤 로깅 라이브러리를 사용할지 Commons-Logging에 명시 적으로 알려주는 것이 좋습니다.
  • 이 지시 사항에 따라commons-logging.properties 파일을 작성하여이를 수행 할 수 있습니다.
  • commons-httpclient 로깅을 구성하기 위해 수행 할 단계는 다음과 같습니다.
    1. 사용할 기본 로깅 프레임 워크를 결정하십시오. 이 선택할 수는 있지만, 아마 log4j또는 java.util.logging당신을 위해 최상의 옵션입니다.
    2. 올바른 Log구현 을 가리 키도록 공통 로깅 특성 파일을 설정하십시오 . 예를 들어 log4j를 사용하려면 이것을 속성 파일 org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger에 넣거나 JDK logging set을 사용하십시오 org.apache.commons.logging.Log=org.apache.commons.logging.impl.Jdk14Logger. 이들은 또한 시스템 속성으로 설정 될 수 있습니다 (예 : -D명령 행에서 사용).
    3. 원하지 않는 메시지를 무시하고 원하는 메시지를 출력하도록 기본 로깅 구현 (예 : log4j)을 구성하십시오.

그것은 많은 단계이지만, 그것이 필요한 것입니다. Apache-commons의 개발자는 이미 로깅 프레임 워크가 구성되어 있다고 가정하는 경향이 있으며 자동 검색을 통해 어떤 프레임 워크를 해결할 수 있습니다.
그것이 사실이 아니라면, 일을 처리하는 것이 조금 더 많은 경향이 있습니다.


답변

이것을 log4j 구성 파일에 넣었습니다.

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

이것은 출력을 경고 레벨 이상으로 제한합니다


답변

이것은 내 테스트에서 효과가있었습니다.

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


답변

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>


답변

그것은이를 찾기 위해 너무 오래 걸렸지 만 jWebUnit을가 번들로 제공 Logback의 로깅 구성 요소, 심지어 사용하지 않도록 log4j.properties하거나 commons-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>

로그 백은 여전히 ​​개발 중이며 API는 계속 변경되는 것으로 보이므로이 코드 샘플은 나중에 실패 할 수 있습니다. 이 StackOverflow 질문 도 참조하십시오 .


답변

JUnit과 함께 RestAssured를 사용하는 동안이 문제가 발생했습니다. 나 에게이 프로그래밍 방식은 효과적이었습니다.

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

    //...
}