天天看點

日志列印出來的對象都是XXX@39ddf169解決方法

前言

使用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>