如何在Dropwizard(Jersey)中记录JSON响应

9
我想知道如何配置Dropwizard以记录JSON响应。
5个回答

13

在Service子类中(例如HelloWorldService),在run方法中添加:

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

然后确保com.sun.jersey.api.container.filter.LoggingFilter(或任何父级包)至少在日志级别INFO上进行配置,例如:

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

由于某些原因,记录器似乎无法配置级别? - Sarp Kaya
请注意,这是在Dropwizard 0.6.x版本时的情况。在0.7.0版本中可能有所改变。我从未使用Dropwizard 0.7.0构建过任何项目,并已转向其他技术,所以不太确定。抱歉。 - Dale Wijnand
LoggingFilter 内部调用 logger.info(...)。 以下是代码片段: private void log(final StringBuilder b) { if (logger != null) { logger.info(b.toString()); } } - Ihor M.

10
在 dropwizard 0.8.1 中(也尝试了 0.9.0-SNAPSHOT),在 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)
                 );
}

要配置日志记录器,请在您的配置文件中添加以下内容(例如:conf.yml):

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

1
LoggingFilter已被弃用。请使用LoggingFeatures更新答案。 - Ramesh

9
答案有点过时,以下是在新版本中需要执行的操作:
env.jersey().register(new LoggingFeature(logger, LoggingFeature.Verbosity.PAYLOAD_ANY));

loggerjava.util.logging.Logger


6
在Dropwizard 0.7.0中,启用请求和响应日志记录的正确语法为:
environment.jersey().property(ResourceConfig.PROPERTY_CONTAINER_REQUEST_FILTERS, LoggingFilter.class.getName());
environment.jersey().property(ResourceConfig.PROPERTY_CONTAINER_RESPONSE_FILTERS, LoggingFilter.class.getName());

3

日志过滤器已经不再推荐使用,我们应该使用LoggingFeature

不幸的是,我无法通过@Click Upvote的答案使其正常工作:

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

以下代码适用于我。它们对应不同的构造函数。

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

这里是两种情况下的构造函数。
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;
}

设置级别就是解决问题的关键。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接