本申請涉及分析錯誤日志的技術,尤其涉及錯誤日志的去重方法及裝置。
背景技術:
通??梢酝ㄟ^日志來記錄設備上程序的運行信息,從而使開發(fā)者方便開發(fā)調試,了解生產環(huán)境執(zhí)行情況。程序出錯時的錯誤日志一般會涉及到異常捕獲,因此通過分析錯誤日志可以了解程序出錯的原因。
目前在分析應用程序的錯誤日志時,通常需要逐一分析每個錯誤日志,但應用程序出錯的原因往往僅限于有限數量的幾種原因,現有技術尚無法做到對相同原因導致程序錯誤的錯誤日志進行去重處理,導致定位程序出錯原因的效率很低。
技術實現要素:
本申請?zhí)峁╁e誤日志的去重方法及裝置,能夠實現對錯誤日志的去重。
根據本申請實施例的第一方面,提供一種錯誤日志的去重方法,該方法包括步驟:
提取錯誤日志中的導致程序運行異常的函數標識;
將所述函數標識組合為去重關鍵字;
根據所述去重關鍵字對所述錯誤日志進行去重。
根據本申請實施例的第二方面,提供一種錯誤日志的去重裝置,包括:
提取模塊,用于提取錯誤日志中的導致程序運行異常的函數標識;
組合模塊,用于將所述函數標識組合為去重關鍵字;
統(tǒng)計模塊,用于根據所述去重關鍵字對所述錯誤日志進行去重。
本申請通過從出錯日志中提取導致程序錯誤的函數標識,并利用函數標識作為組成關鍵字的特征來對出錯日志進行分類,歸類后的日志既可以根據關鍵字定位到具體出錯的程序,又便于對每個類別下的出錯日志的數量等信息進行統(tǒng)計,能夠快速的定位到導致出錯的關鍵問題,從而可提高代碼質量。
附圖說明
圖1為本申請實施例中錯誤日志的去重方法的流程圖;
圖2是本申請實施例中利用本方法對錯誤日志分類的效果呈現圖;
圖3是本申請應用實例中錯誤日志的去重方法的流程圖;
圖3a是本申請應用實例中一個出錯日志的圖示;
圖3b是本申請應用實例中另一個出錯日志的圖示;
圖4是本申請實施例中錯誤日志的去重裝置的硬件架構圖;
圖5是本申請實施例中錯誤日志的去重裝置的軟件邏輯框圖。
具體實施方式
這里將詳細地對示例性實施例進行說明,其示例表示在附圖中。下面的描述涉及附圖時,除非另有表示,不同附圖中的相同數字表示相同或相似的要素。以下示例性實施例中所描述的實施方式并不代表與本申請相一致的所有實施方式。相反,它們僅是與如所附權利要求書中所詳述的、本申請的一些方面相一致的裝置和方法的例子。
在本申請使用的術語是僅僅出于描述特定實施例的目的,而非旨在限制本申請。在本申請和所附權利要求書中所使用的單數形式的“一種”、“所述”和“該”也旨在包括多數形式,除非上下文清楚地表示其他含義。還應當理解,本文中使用的術語“和/或”是指并包含一個或多個相關聯的列出項目的任何或所有可能組合。
應當理解,盡管在本申請可能采用術語第一、第二、第三等來描述各種 信息,但這些信息不應限于這些術語。這些術語僅用來將同一類型的信息彼此區(qū)分開。例如,在不脫離本申請范圍的情況下,第一信息也可以被稱為第二信息,類似地,第二信息也可以被稱為第一信息。取決于語境,如在此所使用的詞語“如果”可以被解釋成為“在……時”或“當……時”或“響應于確定”。
當程序運行出現錯誤時通常可以通過分析錯誤日志了解導致運行錯誤的原因。本申請?zhí)峁╁e誤日志的去重方法,可以對錯誤日志分類,以便使開發(fā)人員能夠盡快對問題進行定位。
本申請的錯誤日志的去重方法可針對智能設備的各種應用程序的錯誤日志進行歸類,應用程序可以是客戶端軟件所運行的應用程序,也可以操作系統(tǒng)所運行的應用程序。智能設備常見的可以是手機、平板電腦、電腦、智能耳機、智能電視、智能手表等設備。操作系統(tǒng)可以是IOS系統(tǒng)、Android系統(tǒng)、Windows系統(tǒng)、Unix系統(tǒng)等??蛻舳塑浖膽贸绦蚶鐚Ш紸pp、音樂App、購物App等。操作系統(tǒng)所運行的應用程序可以是短信服務程序、電話服務程序等。
程序運行出現錯誤時,可能是程序本身所包含的函數發(fā)生錯誤,也可能是程序所調用的外部系統(tǒng)函數發(fā)生錯誤。程序出錯的結果可能是導致應用程序異常終止(例如,應用程序閃退等)。
圖1是本申請錯誤日志的去重方法的流程圖。
S101,提取錯誤日志中的導致程序運行異常的函數標識;
S102,將所提取出的函數標識組合為去重關鍵字;
S103,根據所組合的去重關鍵字對錯誤日志進行去重。
本申請首先從錯誤日志中提取出導致程序運行異常的函數標識,函數標識可以是程序本身所包含的函數標識,也可能是程序所調用的外部系統(tǒng)函數標識。函數標識可以包括類標識和方法標識。提取函數標識的方式可以存在多種,作為一個實施例,可以根據預定標識來查找錯誤日志中是否包含預定標識,并根據根據查找結果按照提取規(guī)則從錯誤日志中提取所需要的函數標 識。
作為一個例子,預定標識可以是第一標簽和程序的標識。第一標簽用來標記函數棧中錯誤線程。例如,在某些日志中,第一標簽可以是“Crashed:”標簽,或者“Thread*Crashed”標簽,“*”為通配符。當然,并不排除在其他的例子中使用其他預定標識來查找函數標識,例如后文中所舉例的第二標簽等。
在一個例子中,可以首先在錯誤日志中查找第一標簽和程序標識。可以根據查找的結果來提取函數標識。提取規(guī)則以下舉例說明。
在一個例子中,當兩個預定標識均存在時,提取程序本身的函數標識。
如果在錯誤日志中第一標簽和程序的標識均被查找到,這種情況下則可以通過提取導致程序運行異常的程序本身所包含的函數來定位錯誤代碼。提取程序的函數的過程可以是:
查找第一標簽所在行后的程序的標識,舉例來說,可以在找到第一個程序的標識后停止查找此行以后的程序標識,并在該程序的標識的所在行提取函數標識。
上述提取規(guī)則可參照如下表1。
表1
在第二個例子中,當兩個預定標識均存在時,提取程序本身的函數標識以及函數棧棧頂的函數標識。
在某些情況下,即使在錯誤日志中第一標簽和程序的標識均被查找到,但為了解決程序本身的函數是“Main”函數等情況(例如,該函數是某個應用程序的入口函數),在本例中可以在錯誤日志中第一標簽和程序的標識均被查找到時,分別提取第一標簽后的程序標識所在行的函數標識(即程序本身 的函數)和第一標簽下一行中的函數標識(即函數棧的棧頂函數標識)。當然,在某些情況下,棧頂函數標識和程序本身的函數標識可能是同一個函數標識(例如,程序的函數標識不是Main函數的時候等)。另外,在某些日志中,棧頂函數標識可以不在第一標簽的下一行中顯示,可以視日志的編寫規(guī)則來調整提取棧頂函數的規(guī)則。
在第三個例子中,如果按照預定標識查找時,查找到第一標簽,但未查找到程序的標識,則可以在第一標簽所在行的下一行提取函數標識,也就是棧頂函數標識。
第二、三個例子的提取規(guī)則如表2所示。
表2
在第四個例子中,如果按照預定標識查找時,查找到程序的標識,未查找到第一標簽;則可提取第一個程序的標識所在行的函數標識。如表3。
表3
在另外的實施例中,如果兩種預定標識均未查找到,則可以提取函數棧的棧頂函數標識。如表4。
表4
在以下的實施例中,預定標識還包括第二標簽,第二標簽用于標記程序調用失敗的函數,在某些日志中,第二標簽可以是“Exception Backtrace”標記,當然不排除在其他日志中以其他字符串標記的可能。當根據第一標簽、程序的標識、第二標簽來查找時,根據不同的查找結果,所提取的函數標識的提取規(guī)則可以如下描述。
如果查找到第一標簽、程序的標識和第二標簽,則可在第一標簽所在行后查找到的第一個程序的標識所在行提取函數標識,在第二標簽所在行后查找首個程序的標識,并在程序的標識的所在行提取函數標識。另外,為了解決所提取的函數標識是Main函數等情況,作為一種優(yōu)選,還可以提取第一標簽下一行中的函數標識。如表5所示。
表5
在一個例子中,如果查找到第一標簽和程序的標識,但未查找到第二標簽,則可按照上文中的表1、表2的提取規(guī)則提取函數標識。
在一個例子中,如果查找到第一標簽、第二標簽,且未查找到程序的標識,則在兩個標簽所在行的下一行分別提取函數標識,即提取函數棧棧頂的函數標識。提取規(guī)則如表6。
表6
另外,如果查找到第一標簽,但未查找到第二標簽和程序的標識,則可提取第一標簽后的函數棧棧頂的函數標識,提取規(guī)則可參考表2。
在一個例子中,如果查找到第二標簽和程序的標識,但未查找到第一標簽,則提取第一個程序的標識所在行的函數標識,以及在第二標簽所在行的下一行提取函數標識。提取規(guī)則如下表7。
表7
另外,在某些情況下,可能會查找到第二標簽,但未查找到第一標簽和程序的標識,則在第二標簽所在行的下一行提取函數標識。提取規(guī)則參見下表8。
表8
再者,當三個預定標識均不存在時,則可按照表4提取日志中首行中的函數標識,即函數棧棧頂的函數標識。
當提取出導致程序錯誤的函數標識后,可將提取出的函數標識組合成關 鍵字,用關鍵字來對日志進行分類。由于所提取的函數標識可以定位到錯誤的函數,因此歸類后的錯誤日志可以看出錯誤日志中每個導致程序錯誤的函數標識的出現頻率的多少,從而可以定位關鍵Bug,并及時指派對應的開發(fā)者進行修復。圖2為一個根據本申請的方法對出錯日志的統(tǒng)計示例。從圖中可以看出,Key1關鍵字的出錯次數明顯高出其他關鍵字,因此可以確定此關鍵字為導致程序出錯的關鍵Bug。
以下是將本申請的方法應用在IOS系統(tǒng)的應用程序的閃退日志的原理描述。
本應用實例中通過第一標簽、程序的標識及第二標簽三個預定標識來查找函數標識。第一標簽為"Crashed:"標記、第二標簽為"Exception Backtrace"標記,程序的標識為應用程序的名稱。為描述方便,以下將字符串"Crashed:"記為A,程序的標識記為B,字符串"Exception Backtrace"記為C。所提取出的函數標識用Line表示,例如,如果提取出一個函數標識,則函數標識為Line1,如果提取出兩個函數標識,則所提取出的函數標識分別為Line1、Line2;如果提取出三個函數標識,則函數標識分別為Line1、Line2、Line3。對閃退日志分類的關鍵字為所提取出的函數標識的組合。
本例中根據不同日志中對三個預定標識的查找結果不同,所應用的提取規(guī)則及關鍵字的組合規(guī)則如下表9所示:
表9
圖3為對各個閃退日志去重的流程圖。
S301,首先查找各閃退日志中是否包含預定標識A、B、C。
圖3a所示的是一個閃退日志的示例,從圖中可以看出,該閃退日志中不包含A、C,包含的B為應用名稱“Alipaywallet”,因此提取出第一個“Alipaywallet”所在行的函數名“DFServiceManager findServiceByName:”。
圖3b所示的是另一個閃退日志的示例,該閃退日志中同時包含A、B、C三個標識,因此,所提取的函數標識分別為:Line1=“PLCrashReporter generateLiveReportWithThread:”;Line2=“_pthread_kill”;Line3=“PromotionManager viewShouldUpdate:”。
S302,根據各個日志所提取的函數名組合成關鍵字。
圖3a的日志的關鍵字可以是函數名“DFServiceManager findServiceByName:”,圖3b的日志的關鍵字可以是Line1+Line2+Line3。
S303,對每個關鍵字的分類下的日志文件的數目進行統(tǒng)計,從而定位到關鍵Bug及相關的開發(fā)設計人員。
與前述出錯日志的去重方法的實施例相對應,本申請還提供了出錯日志的去重裝置的實施例。
本申請出錯日志的去重裝置的實施例可以應用在計算機上。裝置實施例可以通過軟件實現,也可以通過硬件或者軟硬件結合的方式實現。以軟件實現為例,作為一個邏輯意義上的裝置,是通過其所在計算機的處理器將非易失性存儲器中對應的計算機程序指令讀取到內存中運行形成的。從硬件層面而言,如圖4所示,為本申請出錯日志的去重裝置所在計算機的一種硬件結構圖,除了圖4所示的處理器、內存、網絡接口、以及非易失性存儲器之外,實施例中裝置所在的計算機通常根據該計算機的實際功能,還可以包括其他硬件,對此不再贅述。
請參考圖5,錯誤日志的去重裝置500,包括:
提取模塊501,用于提取錯誤日志中的導致程序運行異常的函數標識;
組合模塊502,用于將所述函數標識組合為去重關鍵字;
統(tǒng)計模塊503,用于根據所述去重關鍵字對所述錯誤日志進行去重。
作為一個實施例,導致程序運行異常的函數標識可以包括函數棧的棧頂函數的標識和/或程序的函數標識。
作為一個實施例,提取模塊501提取錯誤日志中的函數標識可以包括:
查找錯誤日志中是否包含預定標識,所述預定標識包括第一標簽和所述程序的標識,所述第一標簽用于標記所述函數棧錯誤線程;
根據查找結果按照提取規(guī)則從所述錯誤日志中提取所述函數標識。
其中,第一標簽可以為Crashed:或Thread*C
rashed等,所述*為通配符。
作為一個實施例,提取規(guī)則可以包括:
如果查找到所述第一標簽和所述程序的標識,則查找所述第一標簽所在行后的程序的標識,并在所述程序的標識的所在行提取所述函數標識;以及在所述第一標簽所在行的下一行提取所述函數標識;
如果查找到所述第一標簽,且未查找到所述程序的標識,則在所述第一標簽所在行的下一行提取所述函數標識。
另外,提取規(guī)則還可以包括以下至少一項:
如果未查找到所述第一標簽,且查找到所述程序的標識,則在第一個所述程序的標識所在行提取所述函數標識;
如果未查找到所述第一標簽和所述程序的標識,則在所述錯誤日志中第一行提取所述函數標識。
在另一個實施例中,預定標識還可以包括第二標簽,所述第二標簽用于標記程序調用失敗的函數;所述提取規(guī)則還可以包括:
如果查找到所述第一標簽、所述應用程序的標識和所述第二標簽,則在所述第二標簽所在行后查找第一個所述程序的標識,并在第一個所述程序的標識的所在行提取所述函數標識;
如果查找到所述第一標簽、所述第二標簽,且未查找到所述程序的標識,則在所述第二標簽所在行的下一行提取所述函數標識。
另外,提取規(guī)則還可以包括:
如果查找到第二標簽和所述程序的標識,且未查找到所述第一標簽,則在所述第二標簽所在行的下一行提取所述函數標識;
如果查找到所述第二標簽,且未查找到所述第一標簽和所述應用程序的標識,則在所述第二標簽所在行的下一行提取所述函數標識。
第二標簽可以是Exception Backtrace標記。
上述裝置中各個單元的功能和作用的實現過程具體詳見上述方法中對應步驟的實現過程,在此不再贅述。
對于裝置實施例而言,由于其基本對應于方法實施例,所以相關之處參見方法實施例的部分說明即可。以上所描述的裝置實施例僅僅是示意性的,其中所述作為分離部件說明的單元可以是或者也可以不是物理上分開的,作為單元顯示的部件可以是或者也可以不是物理單元,即可以位于一個地方,或者也可以分布到多個網絡單元上??梢愿鶕嶋H的需要選擇其中的部分或者全部模塊來實現本申請方案的目的。本領域普通技術人員在不付出創(chuàng)造性勞動的情況下,即可以理解并實施。
以上所述僅為本申請的較佳實施例而已,并不用以限制本申請,凡在本 申請的精神和原則之內,所做的任何修改、等同替換、改進等,均應包含在本申請保護的范圍之內。