打印SpringBoot输出json格式返回报文日志
2022年2月22日
业务需求
使用SpringBoot框架默认配置时,无法将返回报文(json格式)输出到日志文件。生产环境排查问题时比较麻烦。
解决思路
SpringBoot针对json格式转换默认采用的是Jackson工具。内置MappingJackson2HttpMessageConverter类用于将返回的对象转成JSON格式。我们可以通过重装转换的方法将日志输出。
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
/** * 输出日志 * @author yangkui */ @Slf4j public class JsonHttpMessageConverter extends MappingJackson2HttpMessageConverter { private final ObjectMapper objectMapper; public JsonHttpMessageConverter(ObjectMapper objectMapper){ super(); this.objectMapper = objectMapper; } @Override protected void writeInternal(Object object, Type type, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException { super.writeInternal(object, type, outputMessage); String text = objectMapper.writeValueAsString(object); String logText = text; if(!isEmpty(text)&&text.length()>1000){ logText = text.substring(0,1000)+"..."; } log.info("Response:{}", logText); } private boolean isEmpty(String str) { return str == null || str.length() == 0; } } |
还需要定义个自动配置Bean,保证我们自己增加的类能替换SpringBoot默认的bean
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
/** * json格式日志输出配置类 * @author yangkui */ @Configuration public class JsonHttpMessageConverterConfig { @Bean public JsonHttpMessageConverter jsonHttpMessageConverter(ObjectMapper objectMapper){ return new JsonHttpMessageConverter(objectMapper); } } |