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.