Logback高級(jí)用法

在日常的生產(chǎn)中,尤其是在微服務(wù)盛行的今天,我們的服務(wù)很可能是作為分布式應(yīng)用上的一個(gè)點(diǎn)筐赔,會(huì)接受來(lái)自不同客戶端的請(qǐng)求,那么在服務(wù)的為每行日志標(biāo)記出來(lái)自的客戶端呢渔欢?本篇我們通過(guò)介紹Logback的高級(jí)用法盗忱,來(lái)為大家實(shí)現(xiàn)索昂。

  • 擴(kuò)展知識(shí)

在分布式應(yīng)用的今天怔毛,如何通過(guò)日志把客戶端請(qǐng)求的不同應(yīng)用的日志串起來(lái)左痢,展示呢

首先分析原理

其實(shí)很簡(jiǎn)單契耿,就是為每個(gè)線程保存點(diǎn)私有變量瞒大,這個(gè)私有變量的值,由我們自定義宵喂,用于區(qū)分不同的應(yīng)用糠赦。

說(shuō)到線程的私有變量,可能老程序猿,就想到這個(gè)類及 ThreadLocal ,關(guān)于個(gè)類的源碼分析拙泽,小編已經(jīng)寫過(guò)了淌山,這里就不解釋了,繼續(xù)... ,我們今天用到的這個(gè) MDC 就是為每個(gè)線程請(qǐng)求保存私有變量顾瞻,然后在輸出日志的時(shí)候打印出來(lái)泼疑,這樣就能標(biāo)識(shí)出,每一行日志的來(lái)源荷荤。

代碼實(shí)現(xiàn)

Logback 框架已經(jīng)為我們實(shí)現(xiàn)了一套常用的請(qǐng)求退渗,今天我們就用,這個(gè)來(lái)演示蕴纳。
MDCInsertingServletFilter

我們看一下該類的源碼分析一下:

 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        this.insertIntoMDC(request);

        try {
            chain.doFilter(request, response);
        } finally {
            this.clearMDC();
        }

    }

    void insertIntoMDC(ServletRequest request) {
        MDC.put("req.remoteHost", request.getRemoteHost());
        if(request instanceof HttpServletRequest) {
            HttpServletRequest httpServletRequest = (HttpServletRequest)request;
            MDC.put("req.requestURI", httpServletRequest.getRequestURI());
            StringBuffer requestURL = httpServletRequest.getRequestURL();
            if(requestURL != null) {
                MDC.put("req.requestURL", requestURL.toString());
            }

            MDC.put("req.method", httpServletRequest.getMethod());
            MDC.put("req.queryString", httpServletRequest.getQueryString());
            MDC.put("req.userAgent", httpServletRequest.getHeader("User-Agent"));
            MDC.put("req.xForwardedFor", httpServletRequest.getHeader("X-Forwarded-For"));
        }

    }

就是利用 MDC 為每個(gè)處理請(qǐng)求的線程添加上私有變量会油。就是如此,
不過(guò)我們要注意的是為了讓MDC中的信息在任何時(shí)候都是正確有效的古毛,我們需要在request被處理之前翻翩,就講相關(guān)信息放入mdc,再在處理完后稻薇,clear掉嫂冻。
大家看到其實(shí)這個(gè)類是繼承了 Filter 就是一個(gè)過(guò)濾器,在這里小編用的是 SpringBoot實(shí)現(xiàn)的 那么如何使用呢塞椎?

/**
 * @Package: firebird.logger.config.filter
 * @Description: 應(yīng)用配置
 * @author: liuxin
 * @date: 2017/8/29 下午5:32
 */
@Component
public class ApplicationConfig {
    @Bean
    public FilterRegistrationBean filterRegistrationBean() {
        FilterRegistrationBean registrationBean = new FilterRegistrationBean();
        Filter actionFilter = new MDCInsertingServletFilter();
        registrationBean.setFilter(actionFilter);
        List<String> urlPatterns = new ArrayList<>();
        urlPatterns.add("/*");
        registrationBean.setUrlPatterns(urlPatterns);
        return registrationBean;
    }
}

Loback打印日志

該教程還是參考了我之前寫的日志錯(cuò)誤提醒框架桨仿,所以注釋部分包括了使用 Sentry的部分代碼,如果對(duì)錯(cuò)誤收集框架感興趣的同學(xué)案狠,可以看我的另一篇博客
SpringBoot整合Sentry

<configuration>
    <!-- 彩色日志 -->
    <!-- 彩色日志依賴的渲染類 -->
    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
    <conversionRule conversionWord="wex"
                    converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
    <conversionRule conversionWord="wEx"
                    converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
    <!-- 彩色日志格式 -->
    <property name="CONSOLE_LOG_PATTERN"
              value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(--){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>/>



    <property name="MDC_LOG_PATTERN" value="IP:%X{req.remoteHost} -url:%X{req.requestURI} -Method:%X{req.method} - QueryString:%X{req.queryString} - device:%X{req.userAgent}  -ips:%X{req.xForwardedFor}  - %m%n "></property>

    <appender name="Console" class="ch.qos.logback.core.ConsoleAppender">
        <layout>
            <pattern>${MDC_LOG_PATTERN}</pattern>
        </layout>
    </appender>


    <!--<appender name="Sentry" class="com.getsentry.raven.logback.SentryAppender">-->
        <!--&lt;!&ndash;每個(gè)項(xiàng)目生成不通的key&ndash;&gt;-->
        <!--<dsn>http://d73b23c481654b9ca0e4e8a9db310169:daaf5dc2edef462690791ef324316738@sentry.boluome.com/7</dsn>-->
        <!--&lt;!&ndash; 設(shè)置攔截的最低級(jí)別為warn 警告&ndash;&gt;-->
        <!--<filter class="ch.qos.logback.classic.filter.ThresholdFilter">-->
            <!--<level>WARN</level>-->
        <!--</filter>-->
    <!--</appender>-->

    <!--<logger name="logback.SentryAppenderIT" level="INFO">-->
        <!--<appender-ref ref="Sentry"/>-->
    <!--</logger>-->

    <root level="INFO">
        <appender-ref ref="Console"/>
        <!--<appender-ref ref="Sentry"/>-->
    </root>
</configuration>

可以看到 MDC_LOG_PATTERN 中獲取了從MDC過(guò)濾器中的參數(shù)服傍,這樣我們就能打印出來(lái)了

代碼測(cè)試

IP:0:0:0:0:0:0:0:1 -url:/logger -Method:GET - QueryString: - device:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/603.3.8 (KHTML, like Gecko) Version/10.1.2 Safari/603.3.8  -ips:  - URL : http://localhost:10111/logger
IP:0:0:0:0:0:0:0:1 -url:/logger -Method:GET - QueryString: - device:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/603.3.8 (KHTML, like Gecko) Version/10.1.2 Safari/603.3.8  -ips:  - 請(qǐng)求類型 : GET
IP:0:0:0:0:0:0:0:1 -url:/logger -Method:GET - QueryString: - device:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/603.3.8 (KHTML, like Gecko) Version/10.1.2 Safari/603.3.8  -ips:  - 請(qǐng)求IP : 0:0:0:0:0:0:0:1
IP:0:0:0:0:0:0:0:1 -url:/logger -Method:GET - QueryString: - device:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/603.3.8 (KHTML, like Gecko) Version/10.1.2 Safari/603.3.8  -ips:  - 方法 : firebird.logger.rest.OtoRestController.testLogger
IP:0:0:0:0:0:0:0:1 -url:/logger -Method:GET - QueryString: - device:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/603.3.8 (KHTML, like Gecko) Version/10.1.2 Safari/603.3.8  -ips:  - 參數(shù)列表 : []
IP:0:0:0:0:0:0:0:1 -url:/logger -Method:GET - QueryString: - device:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/603.3.8 (KHTML, like Gecko) Version/10.1.2 Safari/603.3.8  -ips:  - hello world !!!
IP:0:0:0:0:0:0:0:1 -url:/logger -Method:GET - QueryString: - device:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/603.3.8 (KHTML, like Gecko) Version/10.1.2 Safari/603.3.8  -ips:  - hello world !!!
IP:0:0:0:0:0:0:0:1 -url:/logger -Method:GET - QueryString: - device:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/603.3.8 (KHTML, like Gecko) Version/10.1.2 Safari/603.3.8  -ips:  - 返回參數(shù) : 請(qǐng)查看日志
IP:0:0:0:0:0:0:0:1 -url:/logger -Method:GET - QueryString: - device:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/603.3.8 (KHTML, like Gecko) Version/10.1.2 Safari/603.3.8  -ips:  - -----------------方法執(zhí)行完畢,耗時(shí):1ms-------------------
IP:192.168.199.191 -url:/logger -Method:GET - QueryString: - device:Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_3 like Mac OS X) AppleWebKit/603.3.8 (KHTML, like Gecko) Version/10.0 Mobile/14G60 Safari/602.1  -ips:  - ----------testLogger方法開始執(zhí)行----------------------------
IP:192.168.199.191 -url:/logger -Method:GET - QueryString: - device:Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_3 like Mac OS X) AppleWebKit/603.3.8 (KHTML, like Gecko) Version/10.0 Mobile/14G60 Safari/602.1  -ips:  - URL : http://192.168.199.235:10111/logger
IP:192.168.199.191 -url:/logger -Method:GET - QueryString: - device:Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_3 like Mac OS X) AppleWebKit/603.3.8 (KHTML, like Gecko) Version/10.0 Mobile/14G60 Safari/602.1  -ips:  - 請(qǐng)求類型 : GET
IP:192.168.199.191 -url:/logger -Method:GET - QueryString: - device:Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_3 like Mac OS X) AppleWebKit/603.3.8 (KHTML, like Gecko) Version/10.0 Mobile/14G60 Safari/602.1  -ips:  - 請(qǐng)求IP : 192.168.199.191
IP:192.168.199.191 -url:/logger -Method:GET - QueryString: - device:Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_3 like Mac OS X) AppleWebKit/603.3.8 (KHTML, like Gecko) Version/10.0 Mobile/14G60 Safari/602.1  -ips:  - 方法 : firebird.logger.rest.OtoRestController.testLogger
IP:192.168.199.191 -url:/logger -Method:GET - QueryString: - device:Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_3 like Mac OS X) AppleWebKit/603.3.8 (KHTML, like Gecko) Version/10.0 Mobile/14G60 Safari/602.1  -ips:  - 參數(shù)列表 : []
IP:192.168.199.191 -url:/logger -Method:GET - QueryString: - device:Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_3 like Mac OS X) AppleWebKit/603.3.8 (KHTML, like Gecko) Version/10.0 Mobile/14G60 Safari/602.1  -ips:  - hello world !!!
IP:192.168.199.191 -url:/logger -Method:GET - QueryString: - device:Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_3 like Mac OS X) AppleWebKit/603.3.8 (KHTML, like Gecko) Version/10.0 Mobile/14G60 Safari/602.1  -ips:  - hello world !!!
IP:192.168.199.191 -url:/logger -Method:GET - QueryString: - device:Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_3 like Mac OS X) AppleWebKit/603.3.8 (KHTML, like Gecko) Version/10.0 Mobile/14G60 Safari/602.1  -ips:  - 返回參數(shù) : 請(qǐng)查看日志
IP:192.168.199.191 -url:/logger -Method:GET - QueryString: - device:Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_3 like Mac OS X) AppleWebKit/603.3.8 (KHTML, like Gecko) Version/10.0 Mobile/14G60 Safari/602.1  -ips:  - -----------------方法執(zhí)行完畢,耗時(shí):0ms-------------------

擴(kuò)展方法如何實(shí)現(xiàn)呢? 不積跬步無(wú)以至千里,接下來(lái)還有要學(xué)習(xí)如何使用

  • Logstash
  • kibana
  • elasticsearch
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市骂铁,隨后出現(xiàn)的幾起案子伴嗡,更是在濱河造成了極大的恐慌,老刑警劉巖从铲,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異澄暮,居然都是意外死亡名段,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門泣懊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)伸辟,“玉大人,你說(shuō)我怎么就攤上這事馍刮⌒欧颍” “怎么了?”我有些...
    開封第一講書人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)静稻。 經(jīng)常有香客問(wèn)我警没,道長(zhǎng),這世上最難降的妖魔是什么振湾? 我笑而不...
    開封第一講書人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任杀迹,我火速辦了婚禮,結(jié)果婚禮上押搪,老公的妹妹穿的比我還像新娘树酪。我一直安慰自己,他們只是感情好大州,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開白布续语。 她就那樣靜靜地躺著,像睡著了一般厦画。 火紅的嫁衣襯著肌膚如雪疮茄。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,262評(píng)論 1 308
  • 那天苛白,我揣著相機(jī)與錄音娃豹,去河邊找鬼。 笑死购裙,一個(gè)胖子當(dāng)著我的面吹牛懂版,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播躏率,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼躯畴,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了薇芝?” 一聲冷哼從身側(cè)響起蓬抄,我...
    開封第一講書人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎夯到,沒(méi)想到半個(gè)月后嚷缭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡耍贾,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年阅爽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片荐开。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡付翁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出晃听,到底是詐尸還是另有隱情百侧,我是刑警寧澤砰识,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站佣渴,受9級(jí)特大地震影響辫狼,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜观话,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一予借、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧频蛔,春花似錦灵迫、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至三圆,卻和暖如春狞换,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背舟肉。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工修噪, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人路媚。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓黄琼,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親整慎。 傳聞我的和親對(duì)象是個(gè)殘疾皇子脏款,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)裤园,斷路器撤师,智...
    卡卡羅2017閱讀 134,701評(píng)論 18 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法拧揽,內(nèi)部類的語(yǔ)法剃盾,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法淤袜,線程的語(yǔ)...
    子非魚_t_閱讀 31,663評(píng)論 18 399
  • 原文地址為 https://github.com/logstash/logstash-logback-encode...
    飛來(lái)來(lái)閱讀 18,553評(píng)論 1 10
  • 來(lái)源:簡(jiǎn)書 著作權(quán)歸作者所有万俗。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處饮怯。
    A49嚴(yán)柳麗閱讀 185評(píng)論 1 1
  • 在《參透生死里》雪漠老師說(shuō)能夠在年輕、健康時(shí)代找到活著的意義嚎研,是一種幸運(yùn)蓖墅。那么我自己呢库倘?找到活著的理由了嗎...
    歸途123閱讀 145評(píng)論 0 0