How to log JSON responses in Dropwizard (Jersey)

匿名 (未验证) 提交于 2019-12-03 08:41:19

问题:

I would like to know how one would configure Dropwizard to log the JSON response.

回答1:

In dropwizard 0.8.1 (also tried in 0.9.0-SNAPSHOT), add to Application.run(...):

import java.util.logging.Logger; import org.glassfish.jersey.filter.LoggingFilter; ... public void run(MyApplicationConfiguration conf, Environment env) throws Exception {     // do your stuff and then add LoggingFilter     env.jersey().register(new LoggingFilter(                      Logger.getLogger(LoggingFilter.class.getName()),                      true)                  ); } 

To configure logger, add in your configuration file (e.g.:conf.yml):

logging:   loggers:     org.glassfish.jersey.filter.LoggingFilter: INFO 


回答2:

In the Service subclass (ex HelloWorldService), in the run method, add:

environment.setJerseyProperty(ResourceConfig.PROPERTY_CONTAINER_REQUEST_FILTERS, LoggingFilter.class.getName()); environment.setJerseyProperty(ResourceConfig.PROPERTY_CONTAINER_RESPONSE_FILTERS, LoggingFilter.class.getName()); 

and then make sure that com.sun.jersey.api.container.filter.LoggingFilter (or any parent package) is configured at least at log level INFO, for example:

logging:   loggers:     "com.sun.jersey.api.container.filter.LoggingFilter": INFO 


回答3:

In dropwizard 0.7.0 the correct syntax to enable request and response logging is:

environment.jersey().property(ResourceConfig.PROPERTY_CONTAINER_REQUEST_FILTERS, LoggingFilter.class.getName()); environment.jersey().property(ResourceConfig.PROPERTY_CONTAINER_RESPONSE_FILTERS, LoggingFilter.class.getName()); 


回答4:

The answers are a bit outdated, this is how it needs to be done in newer versions:

env.jersey().register(new LoggingFeature(logger, LoggingFeature.Verbosity.PAYLOAD_ANY)); 

Where logger is a java.util.logging.Logger



回答5:

Logging Filter is deprecated, so we should be using LoggingFeature.

Unfortunately I could not get it working with @Click Upvote's answer of

env.jersey().register(new LoggingFeature(logger, LoggingFeature.Verbosity.PAYLOAD_ANY));

Following Code worked for me. They correspond to different constructors.

    environment.jersey().register(new LoggingFeature(Logger.getLogger(LoggingFeature.DEFAULT_LOGGER_NAME), Level.INFO, LoggingFeature.Verbosity.PAYLOAD_ANY, LoggingFeature.DEFAULT_MAX_ENTITY_SIZE)); 

Here are the constructors in both the cases.

public LoggingFeature(Logger logger, Integer maxEntitySize) {     this(logger, (Level)null, DEFAULT_VERBOSITY, maxEntitySize); }  public LoggingFeature(Logger logger, Level level, LoggingFeature.Verbosity verbosity, Integer maxEntitySize) {     this.filterLogger = logger;     this.level = level;     this.verbosity = verbosity;     this.maxEntitySize = maxEntitySize; } 

Setting the level is doing the trick.



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!