前言
使用logback/log4j等原生的日志架構,在日志輸出的時候可能會遇到一個問題,經常要列印對象的時候,出現如以下代碼:
log.info("req = {}", aRequest);
列印結果卻是以下形式:
com.hollis.java.ways.ApplyRequest@39ddf169
原因:要列印的對象沒有重寫toString方法,這樣無法将該對象的參數列印出來。
通過JSON把對象轉成String(簡單的解決方法,不高效)
為把對象的值都列印出來,一般要求對于自己定義的入參、出參等定義toString方法。但使用外部定義的request和response對象,他們并沒有覆寫toString,當對這些對象列印的時候,就會出現以上問題。簡單的解決辦法是通過JSON把對象轉成String,如:
log.info("req = {}", JSON.toJSONString(aRequest));
日志輸出:
req = {"name":"Hollis","wechat":"hollischuang","javaways":"Java之道"}
注意:這樣的話就需要在每一個日志記錄的地方人為的要處理下,很不高效,而且也容易遺忘。
借助logback(log4j也有類似的功能)的MessageConverter
/**
* 參數JSON格式化類
*
* @author Hollis
*/
public class ArgumentJsonFormatLayout extends MessageConverter {
@Override
public String convert(ILoggingEvent event) {
try {
return MessageFormatter.arrayFormat(event.getMessage(), Stream.of(event.getArgumentArray())
.map(JSON::toJSONString).toArray()).getMessage();
} catch (Exception e) {
return event.getMessage();
}
}
}
<configuration>
<conversionRule conversionWord="m" converterClass="com.hollis.java.ways.ArgumentJsonFormatLayout"/>
</configuration>