我們在開發的時候,經常要列印日志,有的時候會在一些代碼的關鍵節點處進行日志輸出,
使用logback/log4j等原生的日志框架,在日志輸出的時候可能會遇到一個問題,那就是在列印物件的時候要求物件必須重寫toString方法,否則無法將該物件的引數列印出來,
如代碼 :log.info("req = {}", creditApplyRequest);
日志輸出:
req = com.alibaba.*.request.CreditApplyRequest@39ddf169
我們一般要求對于自己定義的入參、出參等定義toString方法,
但是有些時候,我們使用的是外部定義的request和response物件,他們并沒有覆寫toString,當對這些物件列印的時候,就會出現以上問題,
一般簡單的解決辦法是,可以通過JSON把物件轉成String,如:
代碼 :log.info("req = {}", JSON.toJSONString(ScreditApplyRequest));
日志輸出:
req = {"creditInstitution":"SUN","creditRole":"SELLER","customer":{"aliId":372814,"customerId":"372944","customerType":"ALI"},"origin":"PC","productType":"ECREDIT","tenant":"B2B_SUPPLY"}
但是,這樣的話,就需要在日志記錄的地方人為的要處理下,很不高效,有一個好的辦法,可以一勞永逸:
借助logback(log4j也有類似的功能)的MessageConverter,無侵入性的解決這個問題
1、自定義一個Layout
/**
* 引數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();
}
}
}
2、在logback中配置上這個Layout
<configuration>
<conversionRule conversionWord="m" converterClass="com.alibaba.*.ArgumentJsonFormatLayout"/>
</configuration>
這樣,就可以直接使用log.info("req = {}",obj)這樣的形式記錄日志了,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/276149.html
標籤:其他
上一篇:學而時思之,少走彎路
