




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第基于slf4j日志MDC輸出格式的問題publicvoidformat(finalLogEventevent,finalStringBuildertoAppendTo){
finalReadOnlyStringMapcontextData=event.getContextData();
//ifthereisnoadditionaloptions,weoutputeverysingle
//Key/ValuepairfortheMDCinasimilarformattoHashtable.toString()
//如果沒有附加的屬性,我們輸出每一個(gè)單獨(dú)的MDC配置的key/value對(duì),類似與Hashtable.toString()的格式
if(full){
if(contextData==null||contextData.size()==0){
toAppendTo.append("{}");
return;
appendFully(contextData,toAppendTo);
}else{
if(keys!=null){
if(contextData==null||contextData.size()==0){
toAppendTo.append("{}");
return;
//存在附加屬性配置
appendSelectedKeys(keys,contextData,toAppendTo);
}elseif(contextData!=null){
//otherwisetheyjustwantasinglekeyoutput
finalObjectvalue=contextData.getValue(key);
if(value!=null){
StringBuilders.appendValue(toAppendTo,value);
}
我們配置了%X擴(kuò)展即存在附加屬性配置
//按照配置的MDCkeys輸出,輸出格式為{key=value,key2=value2}
privatestaticvoidappendSelectedKeys(finalString[]keys,finalReadOnlyStringMapcontextData,finalStringBuildersb){
//Printallthekeysinthearraythathaveavalue.
finalintstart=sb.length();
sb.append('{');
for(inti=0;ikeys.length;i++){
finalStringtheKey=keys[i];
finalObjectvalue=contextData.getValue(theKey);
if(value!=null){//!contextData.containskey(theKey)
if(sb.length()-start1){
sb.append(",");
sb.append(theKey).append('=');
StringBuilders.appendValue(sb,value);
sb.append('}');
}
問題定位后修改配置即可,修改配置后驗(yàn)證格式符合我們的期望
Propertyname="layout"%d%p[%t]%c{1.}:%M:%L%X{myTraceId,}%m%n/Property
小結(jié)一下:MDC配置的key,日志會(huì)按照逗號(hào)切分出keys列表,如果keys列表小于等于1則直接輸出一個(gè)單獨(dú)的value值。如果大于1則按照map的格式輸出,即:{key1=value1,key2=value2}
slf4j輸出日志的語法
slf4j輸出log的語法
1.直接拼接字符串
用字符串拼接的構(gòu)造方式輸出log,字符串消息還是會(huì)被求值,存在類型轉(zhuǎn)換和字符串連接的性能消耗。例:
intindex=1;
("這是第"+index+"條數(shù)據(jù)");
("這是第"+String.valueOf(index)+"條數(shù)據(jù)");
輸出結(jié)果:
2.使用SLF4J的格式化功能
這種用法不存在上面提到的缺點(diǎn)。SLF4J使用自己的格式化語法{},同時(shí)提供了適合不同參數(shù)個(gè)數(shù)的方法重載:
logger.debug(Stringformat,Objectparam);//支持一個(gè)參數(shù)
logger.debug(Stringformat,Objectparam1,Objectparam2);//支持兩個(gè)參數(shù)
logger.debug(Stringformat,Object…param);//任意數(shù)量參數(shù),構(gòu)造參數(shù)數(shù)組具有一定的性能損耗
例:
intindex1=1;intindex2=2;i
("這是第{}條數(shù)據(jù)",index1);
("這是第{}、{}條數(shù)據(jù)",index1,index2);
輸出:
3.格式化占位符的轉(zhuǎn)義
連續(xù)的{}才被認(rèn)為是格式化占位符
例:
("{1,2}這是第{}條數(shù)據(jù)",index2);
("{1,2}這是第{{}}條數(shù)據(jù)",index2);
輸出:
用”\”轉(zhuǎn)義{}占位符
例:
/**用”\”轉(zhuǎn)義{}占位符*/
("\\{}這是第{}條數(shù)據(jù)",index2);
/**用“\”本身轉(zhuǎn)義“{}”中的”\”*/
("\\\\{}這是第{}條數(shù)據(jù)",index3);
輸出:
4.log前做條件判斷
isDebugEnabled()的方法在debugdisabled的情況下不存在構(gòu)造字符串參數(shù)的性能消耗,但是如果debugenabled,debug是否被enabled將會(huì)被求值兩次:
一次是isDebugEnabled(),
一次是debug()本身(該影響較小,因?yàn)榍笾祃ogger狀態(tài)花費(fèi)的時(shí)間比真正log一條語句花費(fèi)的時(shí)間的1%都還要小)。
例:
if(logger.isDebugEnabled()){
("這是第{}條數(shù)據(jù)",index2);
輸出:
5、打印異常堆棧
logger.error("Failedtoformat{}",s,e);
slf4j總結(jié)
slf4j是Java的一種LogApi,類似ApacheCommonsLogging。
官網(wǎng)介紹:/.
在SLF4J中,不需要進(jìn)行字符串拼接,不會(huì)導(dǎo)致使用臨時(shí)字符串帶來的消耗。
相反,我們使用帶占位符的模板消息來記錄日志信息,并提供實(shí)際值作為參數(shù)??梢允褂脦?shù)版的日志方法,也可以通過Object數(shù)組傳入。在為日志信息產(chǎn)生最終的字符串之前,該方法會(huì)檢查是否開啟了特定的日志級(jí)別,這不僅降低了內(nèi)存占用,而且預(yù)先減少了執(zhí)行字符串拼接所消耗的CPU時(shí)間。
log.debug("Found{}recordsmatchingfilter:'{}'",records,filter);//slf4j
log.debug("Found"+records+"recordsmatchingfilter:'"+filter+"'");//log4j
可以看出SLF4J的優(yōu)點(diǎn)有:
更簡(jiǎn)略易讀;
在日志級(jí)別不夠時(shí),少了字符串拼接的開銷,不會(huì)調(diào)用對(duì)象(records/filter)的toString方法。通過使用日志記錄方法,直到你使用到的時(shí)候,才會(huì)去構(gòu)造日志信息(字符串),這就同時(shí)提高了內(nèi)存和CPU的使用率。
Slf4j在1.6.0之后,更是支持了異常堆棧的打印,作為最后一個(gè)參數(shù)傳
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- ??漆t(yī)院醫(yī)療體檢中介合作協(xié)議
- 電動(dòng)汽車換電站安全運(yùn)營(yíng)及維護(hù)保養(yǎng)合同
- 機(jī)器人諧波減速器壽命測(cè)試臺(tái)租賃與測(cè)試報(bào)告生成合同
- 生物制造中試基地委托運(yùn)營(yíng)與市場(chǎng)拓展管理協(xié)議
- 高端影視基地全天候安保與安全監(jiān)控服務(wù)協(xié)議
- 抖音平臺(tái)內(nèi)容糾紛仲裁協(xié)議書
- 寵物醫(yī)院品牌合作經(jīng)營(yíng)授權(quán)合同范本
- 離婚協(xié)議中婚前個(gè)人房產(chǎn)權(quán)益保障合同
- 影視音樂制作保密協(xié)議及知識(shí)產(chǎn)權(quán)歸屬合同
- 急性顱腦外傷的急救流程
- 2025年工程管理試題及答案
- 《電纜狀態(tài)監(jiān)測(cè)》課件
- 神經(jīng)鞘瘤MRI診斷要點(diǎn)及鑒別診斷課件
- 青梅綠茶測(cè)試題及答案
- GA 1812.2-2024銀行系統(tǒng)反恐怖防范要求第2部分:數(shù)據(jù)中心
- 聯(lián)鎖系統(tǒng)設(shè)備調(diào)試施工作業(yè)指導(dǎo)書
- 熱網(wǎng)工程施工組織設(shè)計(jì)方案
- 鄉(xiāng)村振興智慧農(nóng)業(yè)項(xiàng)目計(jì)劃書
- 電工技能培訓(xùn)課件下載
- 國(guó)家職業(yè)技術(shù)技能標(biāo)準(zhǔn) 6-31-01-03 電工 人社廳發(fā)2018145號(hào)
- 2024《整治形式主義為基層減負(fù)若干規(guī)定》全文課件
評(píng)論
0/150
提交評(píng)論