将对象参数以json字符串输出到日志中
代码:log.info(“param: {}”, obj);
结果:param: {“k1”:“v1”,“k2”:“v2”}
spring boot项目,将日志以json方式打印。我们在用logback打印日志时,如果传入的参数是个对象,但是日志输出变成:cn.com.xxx.MyBean@68fb2c38,没把对象里的属性值输出,达不到预期效果。除非我们重写对象的toString方法,或者json工具转换一下,比如gson, fastjson, jackson等等。接下来,我们将以实现ch.qos.logback.classic.pattern.MessageConverter的方式去统一json格式的日志输出。
@Getter
@Setter
public class MyBean {
private Integer a;
private Integer b;
}
@Slf4j
public class JsonMessageConverter extends MessageConverter {
private ObjectMapper objectMapper = new ObjectMapper();
@Override
public String convert(ILoggingEvent event) {
try {
Object[] arr = Stream.of(event.getArgumentArray()).map(this::toJsonStr).toArray();
return MessageFormatter.arrayFormat(event.getMessage(), arr).getMessage();
} catch (Exception e) {
return event.getMessage();
}
}
private Object toJsonStr(Object obj) {
try {
return objectMapper.writeValueAsString(obj);
} catch (JsonProcessingException e) {
log.error("json转换异常", e);
}
return obj;
}
}
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<conversionRule conversionWord="m" converterClass="com.yubest.demo.JsonMessageConverter"/>
<include resource="org/springframework/boot/logging/logback/defaults.xml" />
<include resource="org/springframework/boot/logging/logback/console-appender.xml" />
<root level="INFO">
<appender-ref ref="CONSOLE"/>
</root>
</configuration>
MyBean bean = new MyBean();
bean.setA(111111);
bean.setB(222222);
log.info("我是日志:{}", bean);
log.info("我是日志:{}", "abcdef");
log.info("我是日志:{}", 444444);
log.info("我是日志:{}", 555555.55);
log.info("我是日志:{}", true);
我是日志:{"a":111111,"b":222222}
我是日志:"abcdef"
我是日志:444444
我是日志:555555.55
我是日志:true