巧用CurrentThread.Name來統(tǒng)一標識日志記錄(java-logback篇)

java版本支付中心欣簇,日志組件使用的是logback。logback.xml里日志pattern配置如下:

<!--本地日志目錄-->
<property name="USER_HOME" value="${catalina.base}/logs/logback-srv" />
<property name="LOG_MSG" value="%X{sid}%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5p [%c] - %m%n" />
<property name="LOG_DIR" value="${USER_HOME}/%d{yyyyMMdd}"/>
<!--2017-08-22 10:43:19.307 [DubboServerHandler-10.0.0.178:38001-thread-187] INFO  [com.emax.paycenter.backend.facade.IPayCenterFacadeImpl]-->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
        <pattern>${LOG_MSG}</pattern>
    </encoder>
</appender>

pattern里有%t莫鸭,即代表的是線程Id(起初被因,我誤認為這個%t指的是線程IdI缆亍!V嘈)瞄崇,而每一筆交易請求的處理是在一個單獨的線程里,那么它就可以標記每一筆交易請求對應的所有日志尚猿。日志文件截圖如下:

logback-info

分析日志發(fā)現(xiàn)凿掂,這個線程標識如截圖里的“DubboServerHandler-10.0.0.178:38001-thread-195”會被不同的交易請求重用纹蝴,不能唯一標記一個線程處理,這顯然加大了線上問題的排障難度糠涛。昨天晚上兼犯,項目組里我們2人決定要針對這一點不足做一次改進集漾。

之前的.net版支付中心砸脊,我對統(tǒng)一標記一筆交易請求的所有日志做過一次重構(gòu),見《巧用CurrentThread.Name來統(tǒng)一標識日志記錄》凌埂。顯然瞳抓,java的也有必要用一個唯一的標識來標記一筆交易請求的所有日志。

當前線程的線程Id是只讀的栓霜,我們改不了横蜒。那該怎么實現(xiàn)呢?

經(jīng)驗告訴我用currentThread的Name屬性來搞∫鹇遥可是問題來了孟岛,我在交易處理的第一個語句里給當前線程名賦值后,此后的各module各方法里的每一條log.info語句都要顯式記錄上當前線程名斤贰,改動太多了次询。而且,這樣的代碼不免有股怪怪的味道屯吊。

當然送巡,另一個辦法是按照.net版那種思路,做個日志代理類盒卸,對上面的調(diào)用log.info并顯式記錄當前線程名做個封裝骗爆,然后,邏輯代碼里記日志就調(diào)用這個代理類蔽介。這樣實現(xiàn)的弊端與上面的方案半斤八兩摘投。

那怎么辦呢煮寡?

問唄。
先問度娘犀呼,無解幸撕。
接著問同事,說要自己寫一個apperder圆凰。對logback底層代碼的未知會加大解決問題的難度。
【百度:logback 自定義appender
讀logback源碼系列文章(五)——Appender http://kyfxbl.iteye.com/blog/1173788

無心插柳

我早上上班后专钉,先了解了一下構(gòu)造一個唯一字符串標識來給當前線程名賦值挑童。然后在交易處理的的第一個語句前,寫了如下兩行代碼跃须,

public BaseResponse invoke(String requestJSON, BaseRequest baseRequest) throws Exception {
    String threadName = String.format("%s_%s_%s",
            baseRequest.getMethod(),
            new SimpleDateFormat("HHmmssS").format(new Date()),
            UUID.randomUUID().toString().toUpperCase().substring(0, 5));
    Thread.currentThread().setName(threadName);

    log.info("#IPayCenterFacadeImpl,調(diào)用服務:{}", baseRequest.getMethod());
    log.info("#IPayCenterFacadeImpl,請求參數(shù):{}", requestJSON);
    //1.獲取API接口實現(xiàn)
    IPayCenterApi payCenterApi = (IPayCenterApi) payCenterServiceFactory.getService(baseRequest.getMethod());

    //2.處理業(yè)務邏輯
    BaseResponse result = payCenterApi.handle(requestJSON);

    return result;
}

不經(jīng)意間站叼,在運行代碼時,我發(fā)現(xiàn)%t那段的線程信息標識是我給當前線程名設置的那個字符串標識菇民。

這才發(fā)現(xiàn)尽楔,%t或%thread輸出的原來是產(chǎn)生日志的線程名!第练!
【調(diào)試代碼可知 Thread.currentThread().getName():DubboServerHandler-192.168.40.80:28005-thread-2阔馋,Thread.currentThread().getId():246】

經(jīng)過了這個波折,我們的問題最終得到解決娇掏,興奮異常呕寝。看看下面的日志截圖婴梧,一股強烈的成就感油然而生 O(∩_∩)O

logback-變更線程名之后
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末下梢,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子塞蹭,更是在濱河造成了極大的恐慌孽江,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件番电,死亡現(xiàn)場離奇詭異岗屏,居然都是意外死亡,警方通過查閱死者的電腦和手機漱办,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進店門担汤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人洼冻,你說我怎么就攤上這事崭歧。” “怎么了撞牢?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵率碾,是天一觀的道長叔营。 經(jīng)常有香客問我,道長所宰,這世上最難降的妖魔是什么绒尊? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮仔粥,結(jié)果婚禮上婴谱,老公的妹妹穿的比我還像新娘。我一直安慰自己躯泰,他們只是感情好谭羔,可當我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著麦向,像睡著了一般瘟裸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上诵竭,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天话告,我揣著相機與錄音,去河邊找鬼卵慰。 笑死沙郭,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的裳朋。 我是一名探鬼主播病线,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼再扭!你這毒婦竟也來了氧苍?” 一聲冷哼從身側(cè)響起夜矗,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤泛范,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后紊撕,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體罢荡,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年对扶,在試婚紗的時候發(fā)現(xiàn)自己被綠了区赵。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡浪南,死狀恐怖笼才,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情络凿,我是刑警寧澤骡送,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布昂羡,位于F島的核電站,受9級特大地震影響摔踱,放射性物質(zhì)發(fā)生泄漏虐先。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一派敷、第九天 我趴在偏房一處隱蔽的房頂上張望蛹批。 院中可真熱鬧,春花似錦篮愉、人聲如沸腐芍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽甸赃。三九已至,卻和暖如春冗酿,著一層夾襖步出監(jiān)牢的瞬間埠对,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工裁替, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留项玛,地道東北人。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓弱判,卻偏偏與公主長得像襟沮,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子昌腰,可洞房花燭夜當晚...
    茶點故事閱讀 42,828評論 2 345

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理开伏,服務發(fā)現(xiàn),斷路器遭商,智...
    卡卡羅2017閱讀 134,599評論 18 139
  • 1. Java基礎部分 基礎部分的順序:基本語法固灵,類相關(guān)的語法,內(nèi)部類的語法劫流,繼承相關(guān)的語法巫玻,異常的語法,線程的語...
    子非魚_t_閱讀 31,581評論 18 399
  • 從三月份找實習到現(xiàn)在祠汇,面了一些公司仍秤,掛了不少,但最終還是拿到小米可很、百度诗力、阿里、京東我抠、新浪苇本、CVTE导坟、樂視家的研發(fā)崗...
    時芥藍閱讀 42,185評論 11 349
  • 一、認識多任務圈澈、多進程惫周、單線程、多線程 要認識多線程就要從操作系統(tǒng)的原理說起康栈。 以前古老的DOS操作系統(tǒng)(V 6....
    GT921閱讀 1,011評論 0 3
  • 如果第二天要出遠門递递,那么行李一定要在前一天晚上收拾好,然后第二天早上啥么,要在預計好的時間上登舞,再提前一個小時定鬧鐘。 ...
    xll2068閱讀 246評論 2 3