2016-10-21 4 views
2

다음 코드 결과 Dropwizard 0.9.2 및 1.0.2에서 인쇄되는Dropwizard 1.0.2에서 LoggingFeature를 사용하여 서버 응답을 인쇄하는 방법은 무엇입니까? 예를 들어</p> <pre><code>return ClientBuilder .newBuilder() .build() .register(new LoggingFilter(Logger.getLogger(LoggingFilter.class.getName()), true)) </code></pre> <p>: JSON 서버 응답 내의

Oct 21, 2016 7:57:42 AM org.glassfish.jersey.filter.LoggingFilter log 
INFO: 1 * Client response received on thread main 
1 < 401 
1 < Connection: keep-alive 
1 < Content-Length: 49 
1 < Content-Type: text/plain 
1 < Date: Fri, 21 Oct 2016 07:57:42 GMT 
1 < Server: […] 
1 < WWW-Authenticate: Basic realm="[…]" 
Credentials are required to access this resource. 

javax.ws.rs.NotAuthorizedException: HTTP 401 Unauthorized 

그러나 LoggingFilter는 1.0.2에서 사용되지 않으며 대신 LoggingFeature을 사용하는 것이 좋습니다.

javax.ws.rs.NotAuthorizedException: HTTP 401 Unauthorized 
:

return ClientBuilder 
     .newBuilder() 
     .build() 
     .register(new LoggingFeature(Logger.getLogger(getClass().getName()))) 

가 대신 로그가 그냥이 포함되어 다음 documentation of LoggingFeature에서는 기본 상세는 LoggingFeature.Verbosity.PAYLOAD_TEXT, 그래서 난 아직도 Dropwizard 1.0.2에서 JSON 서버 응답을 인쇄하려면 다음 코드를 기다리고 있었다 말한다

+0

변경합니다. 이전에 보았던 다른 내용은 응답 텍스트가 아닙니다. 응답 텍스트는 사실 사용자가 보는 것일뿐 나머지는 자세한 로깅입니다. – pandaadb

+0

@pandaadb 아니, 새로운 LoggingFeature (Logger.getLogger (getClass(). getName()), LoggingFeature.Verbosity.PAYLOAD_ANY)'결과는 똑같은 결과를 가져왔다. 문서에 따르면'PAYLOAD_TEXT'는 (다른 것들 중에서) 내용 유형'application/json'에 해당합니다. – l0b0

답변

4

아르투르 :

new LoggingFeature(Logger.getLogger(getClass().getName()), Level.OFF, LoggingFeature.Verbosity.PAYLOAD_TEXT, 8192) 

클라이언트가 필터 같은보다는으로 포함 역할에 내가 로깅 기능을 같은데요을 예상했다.

+0

아니요! 당신은 착각했습니다. 로깅 기능은 모든 요청을 로깅하고'Verbosity'는 로깅 된 것을 제어합니다. 레벨은 로그 항목을 로거에 넣는 수준입니다. 로그 처리기 수준보다 낮 으면 로그 항목보다 처리기에서 무시됩니다. Level.INFO로 로그하는 것이 좋습니다. LogHandler가 해당 레벨을 무시하지 않도록하십시오. – tobain

+0

내 대답보기 : https://stackoverflow.com/a/47147482/4084137 – tobain

1

그래서 - 이것을 테스트했습니다. 이것은 실제 기능이 아닌 로거 구성 및 기능 구성과 관련된 문제 일 수 있습니다.

public class MainClientTest { 

    public static void main(String[] args) { 

     Client build = ClientBuilder.newBuilder().build(); 

     // Configure Logger to log it all 
     Logger logger = Logger.getLogger("test"); 
     logger.setLevel(Level.ALL); 
     logger.setUseParentHandlers(false); 
     Handler[] handlers = logger.getHandlers(); 
     for(Handler h : handlers) logger.removeHandler(h); 
     logger.addHandler(buildseh()); 
     logger.info("Logger"); 
     build = build.register(new LoggingFeature(logger, Level.ALL, Verbosity.PAYLOAD_ANY, null)); 

     build.target("https://www.google.com").request().get(); 
    } 

    public static StreamHandler buildseh() { 
     final StreamHandler seh = new StreamHandler(System.err, new JdkLoggerFormatter()) { 
      @Override 
      public synchronized void publish(final LogRecord record) { 
       super.publish(record); 
       flush(); 
      } 
     }; 
     seh.setLevel(Level.ALL); // Default StdErr Setting 
     return seh; 
    } 
} 

이 인쇄 : 난 당신이 여기에 원하고 무엇을 인쇄 않습니다 준 힌트는 증거입니다

귀하의 기능 MUST :

1477055066111 I test Logger 
1477055066397 test 1 * Sending client request on thread main 
1 > GET https://www.google.com 

1477055067350 test 1 * Client response received on thread main 
1 < 200 
1 < Accept-Ranges: none 
1 < Alt-Svc: quic=":443"; ma=2592000; v="36,35,34,33,32" 
1 < Cache-Control: private, max-age=0 
1 < Content-Type: text/html; charset=ISO-8859-1 
1 < Date: Fri, 21 Oct 2016 13:04:27 GMT 
1 < Expires: -1 
1 < P3P: CP="This is not a P3P policy! See https://www.google.com/support/accounts/answer/151657?hl=en for more info." 
1 < Server: gws 
1 < Set-Cookie: NID=89=YPr3UcI5rcA4qiaXfm9zkA0uAWrnSDEbxN3TcFuhZ9PkLNvkSHBCHHLcYeXa7tNpzpM_9p7AFAreYq3kR9awqqKrhv5W6pWavfx5bZM7Jjbt559a4aEv20exEPJRmS1N; expires=Sat, 22-Apr-2017 13:04:27 GMT; path=/; domain=.google.co.uk; HttpOnly 
1 < Transfer-Encoding: chunked 
1 < Vary: Accept-Encoding 
1 < X-Frame-Options: SAMEORIGIN 
1 < X-XSS-Protection: 1; mode=block 
<!doctype html><html itemscope="" itemtype="http://schema.org/WebPage" lang="en-GB"><head><meta content="text/html; charset=UTF-8" http-equiv="Content-Type"><meta content="/images/branding/googleg/1x/googleg_standard_color_128dp.png" itemprop="image"><title>Google</title><script>(function(){window.google={kEI:'WxIKWJOeEcGwa_nDmNgC',kEXPI:'1351633,1351901,3700318,3700400,4029815,4031109,4032678,4036527,4038012,4039268,4043492,4045841,4048347,4052304,4062185,4063220,4065786,4066665,4068550,4068816,4069839,4069841,4070140,4070329,4071229,4072287,4072364,4072602,4072705,4072773,4073248,4073405,4073758,4073913,4073959,4074684,4074809,4076096,4076315,4076930,4076999,4077037,4077119,4077 

그래서, 여기에 함정이다 올바른 수준으로 구성되어야합니다. 참조 :

new LoggingFeature(logger, Level.ALL, Verbosity.PAYLOAD_ANY, null) 

로거는 올바른 항목을 기록하도록 구성되어야합니다.

seh.setLevel(Level.ALL); // Default StdErr Setting 
logger.setLevel(Level.ALL); 

그리고 기능은 바로 상세 있어야합니다 Verbosity.PAYLOAD_ANY

을 그리고 그것은 당신이해야 할 모든 것입니다.

감사합니다,이 트릭 않습니다

0

필자에게 @l0b0의 해결책은 로그 요청/응답 페이로드를 기록했지만 액세스 로그는 요청과 응답을 오류로 기록했습니다. 다음 줄은 나를 위해 올바르게 작동했습니다 :

new LoggingFeature(Logger.getLogger(getClass().getName()), Level.INFO, LoggingFeature.Verbosity.PAYLOAD_TEXT, 8192) 
2

개발자가 로깅 기능이 작동하지 않는다고 생각하게하는 간단한 예입니다.

private static final LOG = Logger.getLogger(getClass().getName()); 

public void test() { 
    Client client = ClientBuilder.newBuilder() 
      .register(new LoggingFeature(LOG, Level.FINE, LoggingFeature.Verbosity.PAYLOAD_ALL, 8192)) 
      .build(); 
    // all requests and responses using this client will now be logged 
    // with the log-level FINE to the logger LOG, but the logger 
    // will simply ignore them, because it's default level is INFO 
} 

생성 된 로거 인스턴스 LOG은 정보 인 기본 로그 수준을 사용합니다. 즉, 최소한 INFO 이상의 레벨 (경고, 심각 ... 등)의 모든 로그 메시지를 수락합니다.), FINE처럼 낮은 레벨의 모든 메시지를 무시합니다.

주의 사항 : 핸들러의 기본 로그 레벨은 Level.ALL이며, 로그 레코드를 수정하지 않는 한 로그 레코드를 거부해서는 안됩니다 (부모 로그 작성기가있을 경우 부모 로그 작성자에게 메세지를 전달합니다). 수평.

따라서 메시지를 보려면 LoggingFeatures 수준을 높이거나 로거 수준을 낮춰야합니다.

해결책 1 : LoggingFeature의 수준을 증가 :

new LoggingFeature(LOG, Level.INFO, LoggingFeature.Verbosity.PAYLOAD_ALL, 8192) 

해결책 2 : 로거의 레벨을 감소 : PAYLOAD_ANY 님의

LOG.setLevel(Level.FINE)