本發(fā)明涉及數(shù)據(jù)管理技術(shù)領(lǐng)域,更具體地,涉及一種日志信息格式化方法及系統(tǒng)。
背景技術(shù):
目前,在現(xiàn)有的數(shù)據(jù)管理業(yè)務中,日志是一個必不可少的部分,通過對業(yè)務日志的分析處理,可以了解到業(yè)務的經(jīng)營狀況,同時在服務器出現(xiàn)問題的時候,也可以通過對日志進行分析找出問題所在,方便問題的解決。當前,日志文件都是以原始的格式存放于文件裝置或者數(shù)據(jù)庫裝置,在對業(yè)務運營數(shù)據(jù)進行分析和統(tǒng)計的時候,需要對原始格式的日志數(shù)據(jù)文件進行分析處理,以得到想要的統(tǒng)計結(jié)果。傳統(tǒng)的list日志文件只是一個簡單的字符串文字,開發(fā)者調(diào)試查看日志文件時,需要將list日志文件進行輸出,結(jié)合list文件中各元素的具體數(shù)據(jù)類型進行分析處理。
現(xiàn)有技術(shù)中的日志處理方法,通過建立一個腳本語言解釋器,在該腳本語言解釋器中直接封裝日志格式化處理用函數(shù);針對不同格式的腳本分別建立相應的日志處理腳本從而構(gòu)成動態(tài)腳本庫,在該日志處理腳本中各種格式化操作由上述的函數(shù)完成;載入具有一定格式的日志;根據(jù)所述日志的格式從動態(tài)腳本庫中載入相應的日志處理腳本;由所述的腳本語言解釋器解釋執(zhí)行載入的日志處理腳本,完成日志格式化操作并輸出處理結(jié)果。
然而現(xiàn)有技術(shù)并沒有很好地提出對傳統(tǒng)的list日志文件進行格式化的方法,從而存在以下不足:1、在輸出超長文字的list日志文件時,控制臺會自動對超長文字進行截斷處理,會導致部分日志內(nèi)容信息的丟失;2、根據(jù)list日志文件無法直接獲取所述list日志文件中元素的具體信息。
技術(shù)實現(xiàn)要素:
本發(fā)明為克服上述問題或者至少部分地解決上述技術(shù)問題,提供一種日志信息格式化方法及系統(tǒng)。
根據(jù)本發(fā)明的一個方面,提供一種日志信息格式化方法,包括:
步驟1,當待處理日志文件為list集合時,獲取所述list集合所包含各元素的數(shù)據(jù)類型;
步驟2,基于所述list集合所包含各元素的數(shù)據(jù)類型,將所述list集合日志文件中各元素轉(zhuǎn)換為字符串類型,并依次保存到同一字符串文件中。
進一步,所述獲得所述list集合所包含各元素的數(shù)據(jù)類型的步驟前還包括:
對所述list集合中的各字符串進行截取,獲得所述各元素。
進一步,所述步驟1中獲得所述list集合所包含各元素的數(shù)據(jù)類型的步驟進一步包括:
當所述list集合內(nèi)待獲取數(shù)據(jù)類型的任一元素為list集合時,依次獲取所述任一元素所包含各元素的數(shù)據(jù)類型。
進一步,所述基于所述元素的描述信息,獲取該元素的數(shù)據(jù)類型的步驟進一步包括:
獲取所述元素字符串中的特征字符,根據(jù)所述特征字符所對應的數(shù)據(jù)類型,獲得該元素的數(shù)據(jù)類型。
進一步,所述對所述list集合中的各字符串進行截取的步驟進一步包括:通過依次定位所述list集合中各字符串起始字符與結(jié)束字符,對所述list集合中各字符串進行截取。
進一步,所述獲取所述元素字符串中的特征字符的步驟進一步包括:在所述元素字符串的預設位置獲取相應的特征字符。
進一步,所述步驟1中,通過判斷所述待處理日志文件內(nèi)所含變量為數(shù)組,從而判斷所述待處理日志文件為list集合。
進一步,還包括:
步驟1’,當待處理日志文件為json格式時,當所述json格式日志文件中字符串以"{"開頭,則獲取該字符串中所包含的元素,并通過4字節(jié)縮進的方式獲取所述json格式日志文件中所包含的所有元素。
根據(jù)本發(fā)明的一個方面,提供一種日志信息格式化系統(tǒng),包括:
獲取模塊,用于當待處理日志文件為list集合時,獲取所述list集合所包含各元素的數(shù)據(jù)類型;
格式化模塊,用于基于所述list集合所包含各元素的數(shù)據(jù)類型,將所述list集合日志文件中各元素轉(zhuǎn)換為字符串類型,并依次保存到同一字符串文件中。
本申請?zhí)岢鲆环N日志信息格式化方法及系統(tǒng),所述方法先獲取傳統(tǒng)list集合格式日志文件中各元素的數(shù)據(jù)類型,基于各元素的數(shù)據(jù)類型,將所述list集合格式日志文件中各元素轉(zhuǎn)化為字符串類型,并依次保存到同一字符串文件中。本發(fā)明具有如下有益效果:1、保證了過長字符的list集合格式日志文件內(nèi)容輸出時的完整性;2、能夠直接獲取所述list集合格式日志文件中各元素所包含的具體信息。
附圖說明
圖1為根據(jù)本發(fā)明實施例一種日志信息格式化方法的整體流程示意圖;
圖2為根據(jù)本發(fā)明實施例一種日志信息格式化系統(tǒng)的整體框架示意圖;
圖3為根據(jù)本發(fā)明實施例一種日志信息格式化方法的設備的結(jié)構(gòu)框架示意圖。
具體實施方式
下面結(jié)合附圖和實施例,對本發(fā)明的具體實施方式作進一步詳細描述。以下實施例用于說明本發(fā)明,但不用來限制本發(fā)明的范圍。
本方案對日志的格式化是日志組件內(nèi)部自動實現(xiàn)的,對于使用該組件的人來說內(nèi)部的格式化方法是透明的,也就是不可見的。只需要簡單的函數(shù)調(diào)用就能夠?qū)⑷罩疚募M行完整的格式化輸出。
如圖1,示出本發(fā)明一個具體實施例中一種日志信息格式化方法整體流程示意圖??傮w上,包括以下步驟:
步驟1,當待處理日志文件為list集合時,獲得所述list集合所包含各元素的數(shù)據(jù)類型;
步驟2,基于所述list集合所包含各元素的數(shù)據(jù)類型,將所述list集合日志文件中各元素轉(zhuǎn)換為字符串類型,并依次保存到同一字符串文件中。
在本發(fā)明另一個具體實施例中,一種日志信息格式化方法,所述獲得所述list集合所包含各元素的數(shù)據(jù)類型的步驟前還包括:
對所述list集合中的各字符串進行截取,獲得所述各元素。
在編程語言中l(wèi)ist是標準類庫中的一個類,可以簡單視之為雙向鏈表,以線性列的方式管理物件集合。list的特色是在集合的任何位置增加或刪除元素都很快,但是不支持隨機存取。list是類庫提供的眾多容器(container)之一,除此之外還有vector、set、map、…等等。list以模板方式實現(xiàn)(即泛型),可以處理任意型別的變量,包括使用者自定義的資料型態(tài)例如:它可以是一個放置整數(shù)(int)型態(tài)的list、也可以是放置字串(char或string)型態(tài)的list、或者放置使用者自定類別(user-definedclass)的list。
在本發(fā)明另一個具體實施例中,一種日志信息格式化方法,所述步驟1中獲得所述list集合所包含各元素的數(shù)據(jù)類型的步驟進一步包括:
當所述list集合內(nèi)待獲取數(shù)據(jù)類型的任一元素為list集合時,依次獲取所述任一元素所包含各元素的數(shù)據(jù)類型。
在上述本發(fā)明具體實施例中,list集合中所包含的元素可能為另一個list,同理,這個被包含的list中同樣也包含有l(wèi)ist和各種元素。所以,當對母list進行處理的過程中,如果遇到子list,那么對該子list執(zhí)行與母list相同的處理操作,循環(huán)往復,直至日志文件中所包含的所有包含日志信息的元素信息的數(shù)據(jù)類型被獲取。
在本發(fā)明另一個具體實施例中,一種日志信息格式化方法,所述元素的數(shù)據(jù)類型通過以下步驟獲?。夯谒鲈氐拿枋鲂畔?,獲取該元素的數(shù)據(jù)類型。
在本發(fā)明實施例中,當list集合內(nèi)待獲取數(shù)據(jù)類型的元素不是list集合,而是直接包含具體日志信息的元素時,那么通過獲取該元素的描述信息,基于所述元素的描述信息,獲得該元素的數(shù)據(jù)類型。
在本發(fā)明另一個具體實施例中,一種日志信息格式化方法,所述基于所述元素的描述信息,獲取該元素的數(shù)據(jù)類型的步驟進一步包括:
獲取所述元素字符串中的特征字符,根據(jù)所述特征字符所對應的數(shù)據(jù)類型,獲得該元素的數(shù)據(jù)類型。
在本發(fā)明具體實施例中,先期在所述元素的描述信息的特定位置設置一個特征字符,所述各特征字符對應一種數(shù)據(jù)類型,各種元素所可能數(shù)據(jù)類型互不相同;當需要判斷元素的數(shù)據(jù)類型時,通過獲取所述元素的描述信息中的標記信息,根據(jù)所述標記信息找到其所對應的數(shù)據(jù)類型,從而獲得該元素的數(shù)據(jù)類型。
在本發(fā)明另一個具體實施例中,一種日志信息格式化方法,所述對所述list集合中的各字符串進行截取的步驟進一步包括:通過依次定位所述list集合中各字符串起始字符與結(jié)束字符,對所述list集合中各字符串進行截取。
本發(fā)明具體實施例中上述字符串的截取步驟可以利用但不限于substring()函數(shù)進行實現(xiàn),能夠?qū)崿F(xiàn)如下功能:返回一個新的字符串,它是此字符串的一個子字符串。該子字符串始于指定索引處的字符,一直到此字符串末尾。
在本發(fā)明另一個具體實施例中,一種日志信息格式化方法,所述獲取所述元素字符串中的特征字符的步驟進一步包括:在所述元素字符串的預設位置獲取相應的特征字符。
在本發(fā)明另一個具體實施例中,一種日志信息格式化方法,所述步驟1中,通過判斷所述待處理日志文件內(nèi)所含變量為數(shù)組,從而判斷所述待處理日志文件為list集合。
本發(fā)明具體實施例中上述日志內(nèi)所包含變量的判斷能夠但不限于isarray()函數(shù),以用于返回值指明某變量是否為數(shù)組。
在本發(fā)明另一個具體實施例中,一種日志信息格式化方法,還包括:
步驟1’,當待處理日志文件為json格式時,當所述json格式日志文件中字符串以"{"開頭,則獲取該字符串中所包含的元素,并通過4字節(jié)縮進的方式獲取所述json格式日志文件中所包含的所有元素。
在本發(fā)明上述具體實施例中,json(javascriptobjectnotation)是一種輕量級的數(shù)據(jù)交換格式。它基于ecmascript的一個子集。json采用完全獨立于語言的文本格式,但是也使用了類似于c語言家族的習慣(包括c、c++、c#、java、javascript、perl、python等)。這些特性使json成為理想的數(shù)據(jù)交換語言。易于人閱讀和編寫,同時也易于機器解析和生成(一般用于提升網(wǎng)絡傳輸速率)。
在本發(fā)明另一個具體實施例中,一種日志信息格式化方法,包括:
對于list集合的格式化首先對比一下格式化輸出和非格式化輸出的差異性。
非格式化輸出:
lcom.tool.log.example.model.man;@a06e507;
格式化后的輸出:
通過對比發(fā)現(xiàn)非格式化的集合數(shù)據(jù)進行輸出的時候是無法將集合類的內(nèi)容進行輸出的。如果需要輸出集合中的具體信息還需要解析結(jié)合類的數(shù)據(jù)然后一條一條的打印出來,這樣非常麻煩且浪費時間。
對比觀察發(fā)現(xiàn)格式化后的數(shù)據(jù)是能夠正常輸出相關(guān)數(shù)據(jù)的,并且數(shù)據(jù)格式清晰,日志內(nèi)容信息一目了然,極大的提高了調(diào)試代碼的效率。接下來描述一下是如何將集合list中的數(shù)據(jù)進行格式化輸出的方法。
下面就本發(fā)明具體實施例一種日志信息格式化方法的具體步驟進行說明:
list里面的數(shù)據(jù)是可以是多種類型的,為了將list中的數(shù)據(jù)進行格式的輸出,首先得要判斷l(xiāng)ist內(nèi)的數(shù)據(jù)類型,判斷l(xiāng)ist內(nèi)的數(shù)據(jù)類型的方法是通過自定義函數(shù)stringgettype(listlist)來進行實現(xiàn)的。
自定義函數(shù)stringgettype(listlist)中將集合list傳遞到gettype函數(shù)中,gettpye函數(shù)通過判定后將判定結(jié)果以string的形式進行返回。然后通過for循環(huán)的形式for(inti=0;i<list.size();i++)來遍歷list中的所有數(shù)據(jù),然后對每一個元素調(diào)用gettype函數(shù)來確定該元素的數(shù)據(jù)類型。
對于集合中的元素調(diào)用tostring()方法的時候該函數(shù)會返回元素的描述信息,元素的描述信息有如下特性,如果是整數(shù)[int]則會以“[i”開頭,如果是double類型的則會以“[d”開頭,如果是boolean類型的則會以“z”開頭,如果是byte類型的則會以“[b”開頭,如果是short類型的則會以“[s”開頭,如果是long類型的則會以“[j”開頭,如果是float類型的則會以“[f”開頭,如果是list類型的則會以“[l”開頭。
gettype的實現(xiàn)邏輯如下:
首先通過isarray(object)函數(shù)來判斷該元素是不是一個list,如果是一個list需要對這個list進行遞歸調(diào)用,也就是對這個list需要進行上述類似的處理邏輯流程。如果該元素不是一個list那么就可以通過解析其tostring方法的開頭字母來判定該元素是屬于什么類型的元素。
解析元素中的tostring方法是通過調(diào)用substring字符串截取函數(shù)來對字符串進行截取操作的。具體是通過substring(str.indexof("[")+1,str.indexof("[")+2).charat(0)方法來截取首個字符串的。substring函數(shù)總共有2個參數(shù),第一個是起始位置,第二個是截止位置,本方案中的其實位置是通過調(diào)用str.indexof("[")+1方法來獲取的,其中str.indexof("[")會返回“[”符號出現(xiàn)的索引位置,索引位置+1就是“[”符號出現(xiàn)的位置信息。str.indexof("[")+2使結(jié)束的位置信息,最后通過調(diào)用charat(0)來獲取該截取后的第一個字符串,這樣就能夠獲取到元素中的類型信息了。
對于list集合遍歷循環(huán)過程中每次判定完成一個元素的類型后需要將該元素轉(zhuǎn)換成string類型的數(shù)據(jù)進行輸出。具體的轉(zhuǎn)換邏輯是
如果是”i”,那么表明該數(shù)據(jù)類型是int類型,就通過result.append(arrays.tostring((int[])array));將數(shù)據(jù)存儲到result字符串中。
如果是”d”,那么表明該數(shù)據(jù)類型是double類型,就通過result.append(arrays.tostring((double[])array));將數(shù)據(jù)存儲到result字符串中。
如果是”z”,那么表明該數(shù)據(jù)類型是boolean類型,就通過result.append(arrays.tostring((boolean[])array));將數(shù)據(jù)存儲到result字符串中。
如果是”b”,那么表明該數(shù)據(jù)類型是byte類型,就通過result.append(arrays.tostring((byte[])array));將數(shù)據(jù)存儲到result字符串中。
如果是”s”,那么表明該數(shù)據(jù)類型是short類型,就通過result.append(arrays.tostring((short[])array));將數(shù)據(jù)存儲到result字符串中。
如果是”f”,那么表明該數(shù)據(jù)類型是float類型,就通過result.append(arrays.tostring((float[])array));將數(shù)據(jù)存儲到result字符串中。
通過上述的類型的判定和結(jié)果append(添加)的方式最終list集合中的所有數(shù)據(jù)全部都被保存到result這個變量中了。然后將result的相關(guān)內(nèi)容進行輸出即可。
本具體實施例通過list元素中的標示符來智能判定元素的數(shù)據(jù)類型,根據(jù)不同元素的數(shù)據(jù)類然后調(diào)用不同的append函數(shù)將解析好的數(shù)據(jù)添加到result變量中,使用代碼實現(xiàn)全自動的list數(shù)據(jù)格式化并封裝的過程,這樣就提高了輸出日志的閱讀性。同時也降低了開發(fā)者去自己打印日志數(shù)據(jù)自己格式化的過程,使用起來更加簡潔方便。
在本發(fā)明另一個具體實施例中,一種日志信息格式化方法,包括:
對于json首先來對比一下格式化輸出和非格式化輸出的形式非格式化:
d/test:{‘flag’:true,’user’:{‘id’:32767,’name’:{‘id’:32768}}}
格式化輸出:
可以很明顯的看到格式化輸出的效果對比沒有格式化輸出的效果更容易讓人理解。大大提高了日志的閱讀性。可以很大程度上提升程序的開發(fā)效率。
接下來分析一下json格式化輸出的過程。
首先通過if(jsonstr.startswith("{"))來判斷jsonstr是不是以“{”開頭的,如果是以"{"開頭的表示是json中的元素的開始位置,此時就獲取該元素并對該元素實現(xiàn)4個字節(jié)的縮進。
具體是通過jsonobjectjsonobject=newjsonobject(jsonstr);來件jsonstr轉(zhuǎn)換成一個jsonobject對象,jsonobject是對json的一種抽象描述。然后對該jsonobject元素調(diào)用json=jsonobject.tostring(4);來實現(xiàn)4字節(jié)縮進。
通過上述邏輯的不斷遞歸這樣就能夠?qū)⒃甲址M行格式化城上述所示的字符串的展現(xiàn)形式了。然后對最終格式化完成的數(shù)據(jù)進行輸出就能夠得到所示的形式來展示數(shù)據(jù)。
json數(shù)據(jù)格式的展現(xiàn)形式變得更加容易閱讀,提高了程序的調(diào)試速度可開發(fā)效率。同時為數(shù)據(jù)化格式化后變得更加美觀清晰,能夠很快定位鍵值對的相關(guān)信息內(nèi)容。
如圖2,示出本發(fā)明另一個具體實施例中,一種日志信息格式化系統(tǒng),包括:
獲取模塊a1,用于當待處理日志文件為list集合時,獲取所述list集合所包含各元素的數(shù)據(jù)類型;
格式化模塊a2,用于基于所述list集合所包含各元素的數(shù)據(jù)類型,將所述list集合日志文件中各元素轉(zhuǎn)換為字符串類型,并依次保存到同一字符串文件中。
在本發(fā)明另一個具體實施例中,一種日志信息格式化系統(tǒng),所述獲取模塊還用于:對所述list集合中的各字符串進行截取,獲得所述各元素。
在本發(fā)明另一個具體實施例中,一種日志信息格式化系統(tǒng),所述獲取模塊還用于:當所述list集合內(nèi)待獲取數(shù)據(jù)類型的任一元素為list集合時,依次獲取所述任一元素所包含各元素的數(shù)據(jù)類型。
在本發(fā)明另一個具體實施例中,一種日志信息格式化系統(tǒng),所述獲取模塊還用于:基于所述元素的描述信息,獲取該元素的數(shù)據(jù)類型。
在本發(fā)明另一個具體實施例中,一種日志信息格式化系統(tǒng),所述獲取模塊還用于:獲取所述元素字符串中的特征字符,根據(jù)所述特征字符所對應的數(shù)據(jù)類型,獲得該元素的數(shù)據(jù)類型。
在本發(fā)明另一個具體實施例中,一種日志信息格式化系統(tǒng),所述獲取模塊還用于:通過依次定位所述list集合中各字符串起始字符與結(jié)束字符,對所述list集合中各字符串進行截取。
在本發(fā)明另一個具體實施例中,一種日志信息格式化系統(tǒng),所述獲取模塊還用于:在所述元素字符串的預設位置獲取相應的特征字符。
在本發(fā)明另一個具體實施例中,一種日志信息格式化系統(tǒng),所述獲取模塊還用于:通過判斷所述待處理日志文件內(nèi)所含變量為數(shù)組,從而判斷所述待處理日志文件為list集合。
在本發(fā)明另一個具體實施例中,一種日志信息格式化系統(tǒng),還包括:json格式化模塊,用于:當待處理日志文件為json格式時,當所述json格式日志文件中字符串以"{"開頭,則獲取該字符串中所包含的元素,并通過4字節(jié)縮進的方式獲取所述json格式日志文件中所包含的所有元素。
圖3示出本申請實施例的日志信息格式化方法的設備的結(jié)構(gòu)框圖。
參照圖3,所述日志信息格式化方法的設備,包括:處理器(processor)301、存儲器(memory)302、通信接口(communicationsinterface)303和總線304;
其中,
所述處理器301、存儲器302、通信接口303通過所述總線304完成相互間的通信;
所述通信接口303用于該設備與日志信息格式化方法的通信設備之間的信息傳輸;
所述處理器301用于調(diào)用所述存儲器302中的程序指令,以執(zhí)行上述各方法實施例所提供的方法,例如包括:當待處理日志文件為list集合時,獲得所述list集合所包含各元素的數(shù)據(jù)類型;基于所述list集合所包含各元素的數(shù)據(jù)類型,將所述list集合日志文件中各元素轉(zhuǎn)換為字符串類型,并依次保存到同一字符串文件中。
本實施例公開一種計算機程序產(chǎn)品,所述計算機程序產(chǎn)品包括存儲在非暫態(tài)計算機可讀存儲介質(zhì)上的計算機程序,所述計算機程序包括程序指令,當所述程序指令被計算機執(zhí)行時,計算機能夠執(zhí)行上述各方法實施例所提供的方法,例如包括:當待處理日志文件為list集合時,獲得所述list集合所包含各元素的數(shù)據(jù)類型;基于所述list集合所包含各元素的數(shù)據(jù)類型,將所述list集合日志文件中各元素轉(zhuǎn)換為字符串類型,并依次保存到同一字符串文件中。
本實施例提供一種非暫態(tài)計算機可讀存儲介質(zhì),所述非暫態(tài)計算機可讀存儲介質(zhì)存儲計算機指令,所述計算機指令使所述計算機執(zhí)行上述各方法實施例所提供的方法,例如包括:當待處理日志文件為list集合時,獲得所述list集合所包含各元素的數(shù)據(jù)類型;基于所述list集合所包含各元素的數(shù)據(jù)類型,將所述list集合日志文件中各元素轉(zhuǎn)換為字符串類型,并依次保存到同一字符串文件中。
本領(lǐng)域普通技術(shù)人員可以理解:實現(xiàn)上述方法實施例的全部或部分步驟可以通過程序指令相關(guān)的硬件來完成,前述的程序可以存儲于一計算機可讀取存儲介質(zhì)中,該程序在執(zhí)行時,執(zhí)行包括上述方法實施例的步驟;而前述的存儲介質(zhì)包括:rom、ram、磁碟或者光盤等各種可以存儲程序代碼的介質(zhì)。
以上所描述的直播重連方法的測試設備等實施例僅僅是示意性的,其中所述作為分離部件說明的單元可以是或者也可以不是物理上分開的,作為單元顯示的部件可以是或者也可以不是物理單元,即可以位于一個地方,或者也可以分布到多個網(wǎng)絡單元上??梢愿鶕?jù)實際的需要選擇其中的部分或者全部模塊來實現(xiàn)本實施例方案的目的。本領(lǐng)域普通技術(shù)人員在不付出創(chuàng)造性的勞動的情況下,即可以理解并實施。
通過以上的實施方式的描述,本領(lǐng)域的技術(shù)人員可以清楚地了解到各實施方式可借助軟件加必需的通用硬件平臺的方式來實現(xiàn),當然也可以通過硬件。基于這樣的理解,上述技術(shù)方案本質(zhì)上或者說對現(xiàn)有技術(shù)做出貢獻的部分可以以軟件產(chǎn)品的形式體現(xiàn)出來,該計算機軟件產(chǎn)品可以存儲在計算機可讀存儲介質(zhì)中,如rom/ram、磁碟、光盤等,包括若干指令用以使得一臺計算機設備(可以是個人計算機,服務器,或者網(wǎng)絡設備等)執(zhí)行各個實施例或者實施例的某些部分所述的方法。
最后,本申請的系統(tǒng)僅為較佳的實施方案,并非用于限定本發(fā)明的保護范圍。凡在本發(fā)明的精神和原則之內(nèi),所作的任何修改、等同替換、改進等,均應包含在本發(fā)明的保護范圍之內(nèi)。