基于slf4j日志MDC輸出格式的問題_第1頁
基于slf4j日志MDC輸出格式的問題_第2頁
基于slf4j日志MDC輸出格式的問題_第3頁
基于slf4j日志MDC輸出格式的問題_第4頁
基于slf4j日志MDC輸出格式的問題_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第基于slf4j日志MDC輸出格式的問題publicvoidformat(finalLogEventevent,finalStringBuildertoAppendTo){

finalReadOnlyStringMapcontextData=event.getContextData();

//ifthereisnoadditionaloptions,weoutputeverysingle

//Key/ValuepairfortheMDCinasimilarformattoHashtable.toString()

//如果沒有附加的屬性,我們輸出每一個單獨的MDC配置的key/value對,類似與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擴展即存在附加屬性配置

//按照配置的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('}');

}

問題定位后修改配置即可,修改配置后驗證格式符合我們的期望

Propertyname="layout"%d%p[%t]%c{1.}:%M:%L%X{myTraceId,}%m%n/Property

小結(jié)一下:MDC配置的key,日志會按照逗號切分出keys列表,如果keys列表小于等于1則直接輸出一個單獨的value值。如果大于1則按照map的格式輸出,即:{key1=value1,key2=value2}

slf4j輸出日志的語法

slf4j輸出log的語法

1.直接拼接字符串

用字符串拼接的構(gòu)造方式輸出log,字符串消息還是會被求值,存在類型轉(zhuǎn)換和字符串連接的性能消耗。例:

intindex=1;

("這是第"+index+"條數(shù)據(jù)");

("這是第"+String.valueOf(index)+"條數(shù)據(jù)");

輸出結(jié)果:

2.使用SLF4J的格式化功能

這種用法不存在上面提到的缺點。SLF4J使用自己的格式化語法{},同時提供了適合不同參數(shù)個數(shù)的方法重載:

logger.debug(Stringformat,Objectparam);//支持一個參數(shù)

logger.debug(Stringformat,Objectparam1,Objectparam2);//支持兩個參數(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ù)的{}才被認為是格式化占位符

例:

("{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將會被求值兩次:

一次是isDebugEnabled(),

一次是debug()本身(該影響較小,因為求值logger狀態(tài)花費的時間比真正log一條語句花費的時間的1%都還要小)。

例:

if(logger.isDebugEnabled()){

("這是第{}條數(shù)據(jù)",index2);

輸出:

5、打印異常堆棧

logger.error("Failedtoformat{}",s,e);

slf4j總結(jié)

slf4j是Java的一種LogApi,類似ApacheCommonsLogging。

官網(wǎng)介紹:/.

在SLF4J中,不需要進行字符串拼接,不會導(dǎo)致使用臨時字符串帶來的消耗。

相反,我們使用帶占位符的模板消息來記錄日志信息,并提供實際值作為參數(shù)。可以使用帶參數(shù)版的日志方法,也可以通過Object數(shù)組傳入。在為日志信息產(chǎn)生最終的字符串之前,該方法會檢查是否開啟了特定的日志級別,這不僅降低了內(nèi)存占用,而且預(yù)先減少了執(zhí)行字符串拼接所消耗的CPU時間。

log.debug("Found{}recordsmatchingfilter:'{}'",records,filter);//slf4j

log.debug("Found"+records+"recordsmatchingfilter:'"+filter+"'");//log4j

可以看出SLF4J的優(yōu)點有:

更簡略易讀;

在日志級別不夠時,少了字符串拼接的開銷,不會調(diào)用對象(records/filter)的toString方法。通過使用日志記錄方法,直到你使用到的時候,才會去構(gòu)造日志信息(字符串),這就同時提高了內(nèi)存和CPU的使用率。

Slf4j在1.6.0之后,更是支持了異常堆棧的打印,作為最后一個參數(shù)傳

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論