【问题标题】:How to log JSON responses in Dropwizard (Jersey)如何在 Dropwizard (Jersey) 中记录 JSON 响应
【发布时间】:2013-06-20 12:23:01
【问题描述】:

我想知道如何配置 Dropwizard 以记录 JSON 响应。

【问题讨论】:

    标签: java http jersey dropwizard


    【解决方案1】:

    在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
    

    【讨论】:

    • 由于某种原因,记录器似乎没有配置级别?
    • 请注意,这是在 Dropwizard 0.6.x 天。在 0.7.0 中它可能已经改变。我从来没有用 Dropwizard 0.7.0 构建过任何东西,并且已经远离它,所以我不确定。对不起。
    • LoggingFilter 内部调用 logger.info(...) 这是 sn-p: private void log(final StringBuilder b) { if (logger != null) { logger.info(b.toString ()); } }
    【解决方案2】:

    在 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
    

    【讨论】:

    • LoggingFilter 已弃用。请使用 LoggingFetuers 更新答案
    【解决方案3】:

    答案有点过时了,这就是新版本中需要这样做的方式:

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

    其中loggerjava.util.logging.Logger

    【讨论】:

      【解决方案4】:

      在 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());
      

      【讨论】:

        【解决方案5】:

        日志过滤器已弃用,因此我们应该使用 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;
        }
        

        设置关卡就可以了。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-02-21
          • 2018-11-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-09-26
          • 1970-01-01
          相关资源
          最近更新 更多