2016-10-21 2 views
2

следующие результаты кода в ответах сервера JSON печатается в Dropwizard 0.9.2 и 1.0.2:Как печатать ответы сервера с помощью LoggingFeature в Dropwizard 1.0.2?

return ClientBuilder 
     .newBuilder() 
     .build() 
     .register(new LoggingFilter(Logger.getLogger(LoggingFilter.class.getName()), true)) 

Например:

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. В documentation of LoggingFeature он говорит, что многословие по умолчанию LoggingFeature.Verbosity.PAYLOAD_TEXT, поэтому я ожидал следующий код по-прежнему печатать ответы сервера JSON в Dropwizard 1.0.2:

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

Вместо этого журнала содержит только это:

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

Изменить на: PAYLOAD_ANY. Другой материал, который вы видите ранее, - это не текст ответа. Текст ответа на самом деле только то, что вы видите, а другое - подробное ведение журнала. – pandaadb

+0

@pandaadb Nope, 'new 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; 
    } 
} 

Это печатает:

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. Это означает, что он примет все сообщения журнала с уровнем как минимум INFO или выше (WARNING, SEVERE, ...), но он будет игнорировать все сообщения с более низким уровнем, например FINE. (Он будет по-прежнему передавать сообщение в его родительский логгер, если таковой имеется)

Примечание: Уровень журналов по умолчанию для обработчиков - Level.ALL, и они не должны отклонять записи журнала, если вы не изменяете их уровень.

Таким образом, вам необходимо либо повысить уровень LoggingFeatures, либо снизить уровень регистраторов, чтобы просмотреть сообщения.

Решение 1: Повышение уровня LoggingFeature:

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

Решение 2: Снижение уровня Logger:

LOG.setLevel(Level.FINE) 
Смежные вопросы