Spring Cloud Feign 之日志自定義擴(kuò)展

timg.jpeg

Spring Cloud Feign 之日志自定義擴(kuò)展

遷移到CSDN
環(huán)境信息: java 1.8奶陈、Spring boot 1.5.10.RELEASE简软、spring cloud-Edgware.SR3女仰、maven 3.3+

第二章 Spring Cloud Feign 之日志輸出已經(jīng)對(duì)Feign自帶的日志輸出說(shuō)明智听,與外部HTTP接口交互時(shí)需要記錄一些請(qǐng)求和響應(yīng)日志來(lái)排查問(wèn)題,雖然Feign支持但它的日志是Debug級(jí)別怜珍,并不符合我們?cè)谏a(chǎn)中使用INFO級(jí)別日志要求端蛆,所以這章介紹下自定義日志輸出。

分析Spring Cloud Feign 默認(rèn)日志

首先看下spring cloud feign 對(duì)日志輸出的處理

package org.springframework.cloud.netflix.feign;

import feign.Logger;

/**
 * Allows an application to use a custom Feign {@link Logger}.
 *
 * @author Venil Noronha
 */
public interface FeignLoggerFactory {

   /**
    * Factory method to provide a {@link Logger} for a given {@link Class}.
    *
    * @param type the {@link Class} for which a {@link Logger} instance is to be created
    * @return a {@link Logger} instance
    */
   public Logger create(Class<?> type);

}

通過(guò)源碼我們知道spring cloud feign 已經(jīng)對(duì)feign的日志輸出這塊做了擴(kuò)展酥泛,當(dāng)然feign本身也可以今豆,這里針對(duì)spring cloud feign 進(jìn)行講解。

FeignLoggerFactory是Feign日志工廠接口類(lèi)柔袁,DefaultFeignLoggerFactory是它的默認(rèn)實(shí)現(xiàn)呆躲,spring cloud feign 就是用的 DefaultFeignLoggerFactory

@Override
public Logger create(Class<?> type) {
   return this.logger != null ? this.logger : new Slf4jLogger(type);
}

默認(rèn)日志工廠使用Slf4jLogger日志,然后我們看下源碼

package feign.slf4j;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;

import feign.Request;
import feign.Response;

public class Slf4jLogger extends feign.Logger {

  private final Logger logger;

  public Slf4jLogger() {
    this(feign.Logger.class);
  }

  public Slf4jLogger(Class<?> clazz) {
    this(LoggerFactory.getLogger(clazz));
  }

  public Slf4jLogger(String name) {
    this(LoggerFactory.getLogger(name));
  }

  Slf4jLogger(Logger logger) {
    this.logger = logger;
  }

  @Override
  protected void logRequest(String configKey, Level logLevel, Request request) {
    if (logger.isDebugEnabled()) {
      super.logRequest(configKey, logLevel, request);
    }
  }
    
  @Override
  protected Response logAndRebufferResponse(String configKey, Level logLevel, 
                                      Response response,long elapsedTime) throws IOException {
    if (logger.isDebugEnabled()) {
      return super.logAndRebufferResponse(configKey, logLevel, response, elapsedTime);
    }
    return response;
  }

  @Override
  protected void log(String configKey, String format, Object... args) {
    // Not using SLF4J's support for parameterized messages (even though it would be more efficient) because it would
    // require the incoming message formats to be SLF4J-specific.
    if (logger.isDebugEnabled()) {
      logger.debug(String.format(methodTag(configKey) + format, args));
    }
  }
}

看到這里就知道為什么Spring Cloud Feign 日志輸出的是Debug級(jí)別日志了捶索。

自定Spring Cloud Feign日志輸出

參考DefaultFeignLoggerFactory類(lèi)實(shí)現(xiàn)自己的日志工廠實(shí)現(xiàn)類(lèi)插掂。

場(chǎng)景說(shuō)明:將原有的debug級(jí)別,修改成info級(jí)別

第一步:實(shí)現(xiàn)FeignLoggerFactory工廠接口,InfoFeignLoggerFactoryFeignConfig靜態(tài)內(nèi)部類(lèi)

/**
 * feign info 日志工廠
 */
public static class InfoFeignLoggerFactory implements FeignLoggerFactory {

    @Override
    public Logger create(Class<?> type) {
        return new InfoFeignLogger(LoggerFactory.getLogger(type));
    }
}

第二部: 繼承feign.Logger實(shí)現(xiàn)info級(jí)別日志輸出腥例,InfoFeignLogger使用slf4j日志工具辅甥,此處只是簡(jiǎn)單的實(shí)現(xiàn)了info級(jí)別日志輸出,如果想效率更高請(qǐng)參考Slf4jLogger添加一些日記級(jí)別判斷

/**
 * info feign 日志
 * @author: sunshaoping
 * @date: Create by in 下午3:29 2018/8/8
 */
public class InfoFeignLogger extends feign.Logger {

    private final Logger logger;

    public InfoFeignLogger(Logger logger) {
        this.logger = logger;
    }

    @Override
    protected void log(String configKey, String format, Object... args) {
        if (logger.isInfoEnabled()) {
            logger.info(String.format(methodTag(configKey) + format, args));
        }
    }
}

第三部:日志工廠InfoFeignLoggerFactory注冊(cè)到spring 容器中燎竖,使用spring java Config

/**
 * feign 配置
 * @author: sunshaoping
 * @date: Create by in 下午4:07 2018/8/7
 */
@Configuration
public class FeignConfig {

    @Bean
    Logger.Level feignLevel() {
        return Logger.Level.FULL;
    }

    @Bean
    FeignLoggerFactory infoFeignLoggerFactory() {
        return new InfoFeignLoggerFactory();
    }

}

這樣就實(shí)現(xiàn)了自定義的日志打印了璃弄,簡(jiǎn)單吧,讓我們看看效果构回,是不是變成INFO日志級(jí)別了夏块。

2018-08-08 15:45:39.261  INFO 3514 --- [           main] com.example.feign.UserFeign              : [UserFeign#save] ---> POST http://localhost:8080/user HTTP/1.1
2018-08-08 15:45:39.262  INFO 3514 --- [           main] com.example.feign.UserFeign              : [UserFeign#save] Content-Type: application/json;charset=UTF-8
2018-08-08 15:45:39.262  INFO 3514 --- [           main] com.example.feign.UserFeign              : [UserFeign#save] Content-Length: 27
2018-08-08 15:45:39.262  INFO 3514 --- [           main] com.example.feign.UserFeign              : [UserFeign#save] 
2018-08-08 15:45:39.262  INFO 3514 --- [           main] com.example.feign.UserFeign              : [UserFeign#save] {"id":null,"name":"張三"}
2018-08-08 15:45:39.263  INFO 3514 --- [           main] com.example.feign.UserFeign              : [UserFeign#save] ---> END HTTP (27-byte body)
2018-08-08 15:45:39.691  INFO 3514 --- [           main] com.example.feign.UserFeign              : [UserFeign#save] <--- HTTP/1.1 200 (427ms)
2018-08-08 15:45:39.691  INFO 3514 --- [           main] com.example.feign.UserFeign              : [UserFeign#save] content-length: 0
2018-08-08 15:45:39.691  INFO 3514 --- [           main] com.example.feign.UserFeign              : [UserFeign#save] date: Wed, 08 Aug 2018 07:45:39 GMT
2018-08-08 15:45:39.691  INFO 3514 --- [           main] com.example.feign.UserFeign              : [UserFeign#save] 
2018-08-08 15:45:39.692  INFO 3514 --- [           main] com.example.feign.UserFeign              : [UserFeign#save] <--- END HTTP (0-byte body)

細(xì)心的同學(xué)可能會(huì)發(fā)現(xiàn),為什么我們的FeignLoggerFactory就起作用了纤掸,其實(shí)這是spring 強(qiáng)大的條件裝配功能

當(dāng)FeignLoggerFactory不存在時(shí)才加載默認(rèn)DefaultFeignLoggerFactory,如果對(duì)spring 條件裝配感興趣的同學(xué)可以看下官網(wǎng)脐供,spring boot對(duì)spring條件裝配擴(kuò)展了很多注解。

@Bean
@ConditionalOnMissingBean(FeignLoggerFactory.class)
public FeignLoggerFactory feignLoggerFactory() {
   return new DefaultFeignLoggerFactory(logger);
}

總結(jié)

此章節(jié)介紹了自定義Feign 日志輸出借跪,通過(guò)實(shí)現(xiàn)FeignLoggerFactory工廠類(lèi)接口和繼承feign.Logger類(lèi)政己,還使用了 slf4j日志工具,在項(xiàng)目開(kāi)發(fā)過(guò)程中建議使用slf4j這樣項(xiàng)目在更換日志框架也不用修改源代碼了垦梆,擴(kuò)展性更強(qiáng)匹颤。

樣例地址 spring-cloud-feign 分支 Spring-Cloud-Feign之日志自定義擴(kuò)展

寫(xiě)在最后

Spring Cloud Feign 系列持續(xù)更新中托猩。印蓖。。京腥。赦肃。歡迎關(guān)注

如發(fā)現(xiàn)哪些知識(shí)點(diǎn)有誤或是沒(méi)有看懂,歡迎在評(píng)論區(qū)提出公浪,博主及時(shí)改正他宛。

歡迎轉(zhuǎn)載請(qǐng)注明出處。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末欠气,一起剝皮案震驚了整個(gè)濱河市厅各,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌预柒,老刑警劉巖队塘,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異宜鸯,居然都是意外死亡憔古,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門(mén)淋袖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)鸿市,“玉大人,你說(shuō)我怎么就攤上這事即碗⊙媲椋” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵剥懒,是天一觀的道長(zhǎng)烙样。 經(jīng)常有香客問(wèn)我,道長(zhǎng)蕊肥,這世上最難降的妖魔是什么谒获? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮壁却,結(jié)果婚禮上批狱,老公的妹妹穿的比我還像新娘。我一直安慰自己展东,他們只是感情好赔硫,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著盐肃,像睡著了一般爪膊。 火紅的嫁衣襯著肌膚如雪权悟。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,166評(píng)論 1 284
  • 那天推盛,我揣著相機(jī)與錄音峦阁,去河邊找鬼。 笑死耘成,一個(gè)胖子當(dāng)著我的面吹牛榔昔,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播瘪菌,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼撒会,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了师妙?” 一聲冷哼從身側(cè)響起诵肛,我...
    開(kāi)封第一講書(shū)人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎默穴,沒(méi)想到半個(gè)月后曾掂,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡壁顶,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年珠洗,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片若专。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡许蓖,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出调衰,到底是詐尸還是另有隱情膊爪,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布嚎莉,位于F島的核電站米酬,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏趋箩。R本人自食惡果不足惜赃额,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望叫确。 院中可真熱鬧跳芳,春花似錦、人聲如沸竹勉。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至吓歇,卻和暖如春孽水,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背城看。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工女气, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人析命。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像逃默,于是被迫代替她去往敵國(guó)和親鹃愤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容