如何使用Dropwizard 1.0.2中的LoggingFeature打印服务器响应?

l0b*_*0b0 4 java json jersey dropwizard jersey-client

以下代码导致在Dropwizard 0.9.2和1.0.2中打印JSON服务器响应:

return ClientBuilder
        .newBuilder()
        .build()
        .register(new LoggingFilter(Logger.getLogger(LoggingFilter.class.getName()), true))
Run Code Online (Sandbox Code Playgroud)

例如:

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
Run Code Online (Sandbox Code Playgroud)

但是,LoggingFilter在1.0.2中已弃用,建议使用LoggingFeature.在LoggingFeature文档中,它说默认的详细程度是LoggingFeature.Verbosity.PAYLOAD_TEXT,所以我期待以下代码仍然在Dropwizard 1.0.2中打印JSON服务器响应:

return ClientBuilder
        .newBuilder()
        .build()
        .register(new LoggingFeature(Logger.getLogger(getClass().getName())))
Run Code Online (Sandbox Code Playgroud)

而是日志包含这个:

javax.ws.rs.NotAuthorizedException: HTTP 401 Unauthorized
Run Code Online (Sandbox Code Playgroud)

l0b*_*0b0 6

这样做的诀窍:

new LoggingFeature(Logger.getLogger(getClass().getName()), Level.OFF, LoggingFeature.Verbosity.PAYLOAD_TEXT, 8192)
Run Code Online (Sandbox Code Playgroud)

我猜测客户端中的日志记录功能就像过滤器一样,而不是像预期的那样包含.


tob*_*ain 5

一个简短的例子来说明一个常见问题,它使开发人员认为日志记录功能不起作用.

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
}
Run Code Online (Sandbox Code Playgroud)

创建的记录器实例LOG使用默认日志级别,即INFO.这意味着它将接受级别至少为INFO或更高级别的所有日志消息(WARNING,SEVERE,...),但它将忽略具有较低级别的所有消息,如FINE.(它仍会将消息传递给它的父记录器,如果有的话)

注意:处理程序的默认日志级别是Level.ALL,它们不应拒绝任何日志记录,只要您不修改它们的级别即可.

因此,您需要提高LoggingFeatures级别或降低记录器级别以查看消息.

解决方案1:提高LoggingFeature的级别:

new LoggingFeature(LOG, Level.INFO, LoggingFeature.Verbosity.PAYLOAD_ALL, 8192)
Run Code Online (Sandbox Code Playgroud)

解决方案2:降低记录器的级别:

LOG.setLevel(Level.FINE)
Run Code Online (Sandbox Code Playgroud)