Spring Boot Actuator端点的漂亮打印JSON输出

时间:2014-07-01 06:33:31

标签: json spring spring-boot

Spring Boot Actuator 监控 应用程序提供了几个端点

/metrics
/beans
/health
...

使用以下方法检查端点:

curl http://localhost:8080/metrics

结果:

{"counter.status.200.env":1,"counter.status.200.health":1,"counter.status.200.info":2,"counter.status.200.metrics":2,"gauge.response.env":5.0,"gauge.response.health":22.0,"gauge.response.info":1.0,"gauge.response.metrics":1.0,"mem":1030144,"mem.free":56118,"processors":8,"uptime":5108095,"instance.uptime":5102906,"heap.committed":1030144,"heap.init":262144,"heap.used":974031,"heap":3728384,"threads.peak":81,"threads.daemon":21,"threads":77,"classes":8854,"classes.loaded":8860,"classes.unloaded":6,"gc.ps_scavenge.count":119,"gc.ps_scavenge.time":7223,"gc.ps_marksweep.count":12,"gc.ps_marksweep.time":17573}

很好用于机器消费难以阅读

我想格式化(即漂亮打印) Spring Boot Actuator 端点的 JSON 输出,以便于阅读由操作人员。

类似的东西:

{
  "counter.status.200.env":1,
  "counter.status.200.health":1,
  "counter.status.200.info":2,
  "counter.status.200.metrics":2,
  "gauge.response.env":5.0,
  "gauge.response.health":22.0,
  "gauge.response.info":1.0,
  ...
}

我尝试过设置

http.mappers.json-pretty-print=true 

但此设置不会影响执行器输出。

弹簧启动执行器JSON 输出的启用漂亮打印配置吗?

更新

official sample对我有用。

遵循@DaveSyer的评论非常重要:要设置的属性是

http.mappers.jsonPrettyPrint=true

调查仍在进行中。

与此同时,我使用json pretty print 命令行作为解决方法

安装jsonpp(例如OS X):

brew install jsonpp

然后通过jsonpp管理curl输出,jsonpp可以动态格式化json文件:

curl http://localhost:8080/metrics | jsonpp

结果:

{
  "counter.status.200.env": 1,
  "counter.status.200.health": 1,
  "counter.status.200.info": 2,
  "counter.status.200.metrics": 2,
  ...
}

14 个答案:

答案 0 :(得分:47)

根据http://docs.spring.io/spring-boot/docs/current/reference/html/howto-spring-mvc.html#howto-customize-the-jackson-objectmapper,在Spring Boot(至少1.2.2)中使用Jackson启用漂亮打印的官方方法是设置以下属性:

 # Pretty-print JSON responses
 spring.jackson.serialization.indent_output=true

答案 1 :(得分:13)

对于Spring Boot 1.5.1,我有我的YML文件:

spring:
  jackson:
    serialization:
      INDENT_OUTPUT: true

@BertrandRenuart答案是最接近的,但是IDE没有看到indent_output是正确的。

答案 2 :(得分:10)

“http.mappers”属性对我有用,但我认为你可能需要它来自驼峰(“jsonPrettyPrint”)。

答案 3 :(得分:7)

执行以下操作:

@Configuration
public class JacksonConfig {

    @Autowired
    private ObjectMapper objectMapper; //reuse the pre-configured mapper


    @PostConstruct
    public void setup() {
        objectMapper.enable(SerializationFeature.INDENT_OUTPUT);
        //whatever else you need
    }


}

这是有效的,因为Spring Boot使用ObjectMapper bean来执行所有与JSON相关的操作。

但请注意,此配置将打印所有JSON输出,而不仅仅是与执行器相关的内容。

<强>更新

@DaveSyer的答案显然更好!我还没找到用于配置Jackson的HttpMapperProperties对象。 This是Javadoc

答案 4 :(得分:4)

其实我也想这样做。但后来我问:为什么?为了更好地调试我的服务,这会带来很小的性能损失。

只需使用浏览器扩展程序like this one :)即可获得此类视图

enter image description here

答案 5 :(得分:3)

我使用Python常用的json.tool模块:

curl --silent http://localhost:8080/metrics | python -mjson.tool

答案 6 :(得分:2)

使用spring-boot 1.2.6,您需要使用:

spring.jackson.serialization.INDENT_OUTPUT=true

使用旧的http.mappers时来自我的日志。*:

http.mappers.json-pretty-print is deprecated. If you are using Jackson, spring.jackson.serialization.INDENT_OUTPUT=true should be used instead.

答案 7 :(得分:1)

我使用a来打印JSON以及过滤它。对于JSON,它基本上是jq。在Mac上,它可以与自制软件一起安装。 (https://stedolan.github.io/jq/

sed

答案 8 :(得分:1)

而不是使用curl我喜欢使用httpie作为http命令行客户端:

http http://localhost:8080/metrics

这已经格式化并且语法突出显示json响应,而不必将输出传递给另一个命令。命令语法也更加人性化。

答案 9 :(得分:1)

如果您在Spring中使用 gson 序列化,那么其他任何答案都不适合您。您必须使用此配置选项:

spring.gson.pretty-printing=true

从版本2.0.3.Release确认使用Spring Boot。

答案 10 :(得分:0)

不幸的是,应用程序属性

  

spring.jackson.serialization.INDENT_OUTPUT

对我没用(春季启动版本1.2.6到1.4.0.RELEASE)。相反,在我的 WebMvcConfigurerAdapter 的扩展中,我覆盖了 configureMessageConverters()并添加了我自己的Jackson2ObjectMapperBuilder:

@Configuration
@EnableWebMvc
public class WebMvcConfig extends WebMvcConfigurerAdapter {
   ...
    private MappingJackson2HttpMessageConverter jacksonMessageConverter() {
        Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder()
                .featuresToDisable(SerializationFeature.FAIL_ON_EMPTY_BEANS,
                        SerializationFeature.WRITE_CHAR_ARRAYS_AS_JSON_ARRAYS)
                .featuresToEnable(SerializationFeature.INDENT_OUTPUT).modulesToInstall(hibernate4Module());
        // can use this instead of featuresToEnable(...)
        builder.indentOutput(true);
        return new MappingJackson2HttpMessageConverter(builder.build());
    }


    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.add(jacksonMessageConverter());
        super.configureMessageConverters(converters);
    }

   ...

}

这似乎是我在Spring boot 1.4.0.RELEASE上的技巧,我的执行器输出现在已经打印出来了(以及其他所有json输出)

答案 11 :(得分:0)

这是我的Emacs函数,用于从端点检索Spring Actuator Json:

(defvar my/spring-actuator-server-history nil)
(defvar my/spring-actuator-last-server "http://localhost:8080")
(defvar my/spring-actuator-path-history nil)
(defvar my/spring-actuator-path-completion
  '("actuator" "auditevents" "autoconfig" "beans" "configprops" "dump" "env" "flyway" "health" "heapdump"
    "info" "jolokia" "liquibase" "logfile" "loggers" "mappings" "metrics" "shutdown" "trace")))

(defun my/spring-actuator (server path)
  (interactive (list (read-string "Server: " my/spring-actuator-last-server 'my/spring-actuator-server-history)
                     (completing-read "Path: " my/spring-actuator-path-completion nil nil "" 'my/spring-actuator-path-history)))
  (setq my/spring-actuator-last-server server)
  (let ( (bufname (format "actuator: %s" path)) )
    (when (get-buffer bufname)
      (kill-buffer bufname))
    (switch-to-buffer (url-retrieve-synchronously (format "%s/%s" server path)))
    (rename-buffer bufname)
    (goto-char (point-min))
    (re-search-forward "^$" nil 'move)
    (forward-char)
    (delete-region (point-min) (point))
    (json-pretty-print-buffer)
    (json-mode) ))

如果您不喜欢依赖外部json-mode库,请将其替换为js-mode

答案 12 :(得分:0)

万一使用Spring Boot 2(在我的情况下为2.1.1)的人像我一样偶然发现了这个问题:我们也遇到了同样的问题,而对于2.1.1来说,答案都无济于事。

所以我们要做的是用一个新端点替换现有端点(在我们的例子中为health)。我在this answer的末尾描述了它。是的,这将我们的解决方案限制在该单个端点上,但是另一方面,它的优点是能够以您想要的任何方式格式化输出-包括漂亮的打印JSON,如果需要(也可以通过服务输出,则输出样式化的HTML)浏览器中的技术人员)。请注意produces的{​​{1}}属性。

答案 13 :(得分:-1)

这不起作用

spring.jackson.serialization.INDENT_OUTPUT=true

这有效spring.jackson.serialization.indent-output=true