具体实施方式
这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本申请相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本申请的一些方面相一致的装置和方法的例子。
在本申请使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本申请。在本申请和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。还应当理解,本文中使用的术语“和/或”是指并包含一个或多个相关联的列出项目的任何或所有可能组合。
应当理解,尽管在本申请可能采用术语第一、第二、第三等来描述各种信息,但这些信息不应限于这些术语。这些术语仅用来将同一类型的信息彼此区分开。例如,在不脱离本申请范围的情况下,第一信息也可以被称为第二信息,类似地,第二信息也可以被称为第一信息。取决于语境,如在此所使用的词语“如果”可以被解释成为“在……时”或“当……时”或“响应于确定”。
当程序运行出现错误时通常可以通过分析错误日志了解导致运行错误的原因。本申请提供错误日志的去重方法,可以对错误日志分类,以便使开发人员能够尽快对问题进行定位。
本申请的错误日志的去重方法可针对智能设备的各种应用程序的错误日志进行归类,应用程序可以是客户端软件所运行的应用程序,也可以操作系统所运行的应用程序。智能设备常见的可以是手机、平板电脑、电脑、智能耳机、智能电视、智能手表等设备。操作系统可以是IOS系统、Android系统、Windows系统、Unix系统等。客户端软件的应用程序例如导航App、音乐App、购物App等。操作系统所运行的应用程序可以是短信服务程序、电话服务程序等。
程序运行出现错误时,可能是程序本身所包含的函数发生错误,也可能是程序所调用的外部系统函数发生错误。程序出错的结果可能是导致应用程序异常终止(例如,应用程序闪退等)。
图1是本申请错误日志的去重方法的流程图。
S101,提取错误日志中的导致程序运行异常的函数标识;
S102,将所提取出的函数标识组合为去重关键字;
S103,根据所组合的去重关键字对错误日志进行去重。
本申请首先从错误日志中提取出导致程序运行异常的函数标识,函数标识可以是程序本身所包含的函数标识,也可能是程序所调用的外部系统函数标识。函数标识可以包括类标识和方法标识。提取函数标识的方式可以存在多种,作为一个实施例,可以根据预定标识来查找错误日志中是否包含预定标识,并根据根据查找结果按照提取规则从错误日志中提取所需要的函数标识。
作为一个例子,预定标识可以是第一标签和程序的标识。第一标签用来标记函数栈中错误线程。例如,在某些日志中,第一标签可以是“Crashed:”标签,或者“Thread*Crashed”标签,“*”为通配符。当然,并不排除在其他的例子中使用其他预定标识来查找函数标识,例如后文中所举例的第二标签等。
在一个例子中,可以首先在错误日志中查找第一标签和程序标识。可以根据查找的结果来提取函数标识。提取规则以下举例说明。
在一个例子中,当两个预定标识均存在时,提取程序本身的函数标识。
如果在错误日志中第一标签和程序的标识均被查找到,这种情况下则可以通过提取导致程序运行异常的程序本身所包含的函数来定位错误代码。提取程序的函数的过程可以是:
查找第一标签所在行后的程序的标识,举例来说,可以在找到第一个程序的标识后停止查找此行以后的程序标识,并在该程序的标识的所在行提取函数标识。
上述提取规则可参照如下表1。
表1
在第二个例子中,当两个预定标识均存在时,提取程序本身的函数标识以及函数栈栈顶的函数标识。
在某些情况下,即使在错误日志中第一标签和程序的标识均被查找到,但为了解决程序本身的函数是“Main”函数等情况(例如,该函数是某个应用程序的入口函数),在本例中可以在错误日志中第一标签和程序的标识均被查找到时,分别提取第一标签后的程序标识所在行的函数标识(即程序本身的函数)和第一标签下一行中的函数标识(即函数栈的栈顶函数标识)。当然,在某些情况下,栈顶函数标识和程序本身的函数标识可能是同一个函数标识(例如,程序的函数标识不是Main函数的时候等)。另外,在某些日志中,栈顶函数标识可以不在第一标签的下一行中显示,可以视日志的编写规则来调整提取栈顶函数的规则。
在第三个例子中,如果按照预定标识查找时,查找到第一标签,但未查找到程序的标识,则可以在第一标签所在行的下一行提取函数标识,也就是栈顶函数标识。
第二、三个例子的提取规则如表2所示。
表2
在第四个例子中,如果按照预定标识查找时,查找到程序的标识,未查找到第一标签;则可提取第一个程序的标识所在行的函数标识。如表3。
表3
在另外的实施例中,如果两种预定标识均未查找到,则可以提取函数栈的栈顶函数标识。如表4。
表4
在以下的实施例中,预定标识还包括第二标签,第二标签用于标记程序调用失败的函数,在某些日志中,第二标签可以是“Exception Backtrace”标记,当然不排除在其他日志中以其他字符串标记的可能。当根据第一标签、程序的标识、第二标签来查找时,根据不同的查找结果,所提取的函数标识的提取规则可以如下描述。
如果查找到第一标签、程序的标识和第二标签,则可在第一标签所在行后查找到的第一个程序的标识所在行提取函数标识,在第二标签所在行后查找首个程序的标识,并在程序的标识的所在行提取函数标识。另外,为了解决所提取的函数标识是Main函数等情况,作为一种优选,还可以提取第一标签下一行中的函数标识。如表5所示。
表5
在一个例子中,如果查找到第一标签和程序的标识,但未查找到第二标签,则可按照上文中的表1、表2的提取规则提取函数标识。
在一个例子中,如果查找到第一标签、第二标签,且未查找到程序的标识,则在两个标签所在行的下一行分别提取函数标识,即提取函数栈栈顶的函数标识。提取规则如表6。
表6
另外,如果查找到第一标签,但未查找到第二标签和程序的标识,则可提取第一标签后的函数栈栈顶的函数标识,提取规则可参考表2。
在一个例子中,如果查找到第二标签和程序的标识,但未查找到第一标签,则提取第一个程序的标识所在行的函数标识,以及在第二标签所在行的下一行提取函数标识。提取规则如下表7。
表7
另外,在某些情况下,可能会查找到第二标签,但未查找到第一标签和程序的标识,则在第二标签所在行的下一行提取函数标识。提取规则参见下表8。
表8
再者,当三个预定标识均不存在时,则可按照表4提取日志中首行中的函数标识,即函数栈栈顶的函数标识。
当提取出导致程序错误的函数标识后,可将提取出的函数标识组合成关键字,用关键字来对日志进行分类。由于所提取的函数标识可以定位到错误的函数,因此归类后的错误日志可以看出错误日志中每个导致程序错误的函数标识的出现频率的多少,从而可以定位关键Bug,并及时指派对应的开发者进行修复。图2为一个根据本申请的方法对出错日志的统计示例。从图中可以看出,Key1关键字的出错次数明显高出其他关键字,因此可以确定此关键字为导致程序出错的关键Bug。
以下是将本申请的方法应用在IOS系统的应用程序的闪退日志的原理描述。
本应用实例中通过第一标签、程序的标识及第二标签三个预定标识来查找函数标识。第一标签为"Crashed:"标记、第二标签为"Exception Backtrace"标记,程序的标识为应用程序的名称。为描述方便,以下将字符串"Crashed:"记为A,程序的标识记为B,字符串"Exception Backtrace"记为C。所提取出的函数标识用Line表示,例如,如果提取出一个函数标识,则函数标识为Line1,如果提取出两个函数标识,则所提取出的函数标识分别为Line1、Line2;如果提取出三个函数标识,则函数标识分别为Line1、Line2、Line3。对闪退日志分类的关键字为所提取出的函数标识的组合。
本例中根据不同日志中对三个预定标识的查找结果不同,所应用的提取规则及关键字的组合规则如下表9所示:
表9
图3为对各个闪退日志去重的流程图。
S301,首先查找各闪退日志中是否包含预定标识A、B、C。
图3a所示的是一个闪退日志的示例,从图中可以看出,该闪退日志中不包含A、C,包含的B为应用名称“Alipaywallet”,因此提取出第一个“Alipaywallet”所在行的函数名“DFServiceManager findServiceByName:”。
图3b所示的是另一个闪退日志的示例,该闪退日志中同时包含A、B、C三个标识,因此,所提取的函数标识分别为:Line1=“PLCrashReportergenerateLiveReportWithThread:”;Line2=“_pthread_kill”;Line3=“PromotionManager viewShouldUpdate:”。
S302,根据各个日志所提取的函数名组合成关键字。
图3a的日志的关键字可以是函数名“DFServiceManagerfindServiceByName:”,图3b的日志的关键字可以是Line1+Line2+Line3。
S303,对每个关键字的分类下的日志文件的数目进行统计,从而定位到关键Bug及相关的开发设计人员。
与前述出错日志的去重方法的实施例相对应,本申请还提供了出错日志的去重装置的实施例。
本申请出错日志的去重装置的实施例可以应用在计算机上。装置实施例可以通过软件实现,也可以通过硬件或者软硬件结合的方式实现。以软件实现为例,作为一个逻辑意义上的装置,是通过其所在计算机的处理器将非易失性存储器中对应的计算机程序指令读取到内存中运行形成的。从硬件层面而言,如图4所示,为本申请出错日志的去重装置所在计算机的一种硬件结构图,除了图4所示的处理器、内存、网络接口、以及非易失性存储器之外,实施例中装置所在的计算机通常根据该计算机的实际功能,还可以包括其他硬件,对此不再赘述。
请参考图5,错误日志的去重装置500,包括:
提取模块501,用于提取错误日志中的导致程序运行异常的函数标识;
组合模块502,用于将所述函数标识组合为去重关键字;
统计模块503,用于根据所述去重关键字对所述错误日志进行去重。
作为一个实施例,导致程序运行异常的函数标识可以包括函数栈的栈顶函数的标识和/或程序的函数标识。
作为一个实施例,提取模块501提取错误日志中的函数标识可以包括:
查找错误日志中是否包含预定标识,所述预定标识包括第一标签和所述程序的标识,所述第一标签用于标记所述函数栈错误线程;
根据查找结果按照提取规则从所述错误日志中提取所述函数标识。
其中,第一标签可以为Crashed:或Thread*C
rashed等,所述*为通配符。
作为一个实施例,提取规则可以包括:
如果查找到所述第一标签和所述程序的标识,则查找所述第一标签所在行后的程序的标识,并在所述程序的标识的所在行提取所述函数标识;以及在所述第一标签所在行的下一行提取所述函数标识;
如果查找到所述第一标签,且未查找到所述程序的标识,则在所述第一标签所在行的下一行提取所述函数标识。
另外,提取规则还可以包括以下至少一项:
如果未查找到所述第一标签,且查找到所述程序的标识,则在第一个所述程序的标识所在行提取所述函数标识;
如果未查找到所述第一标签和所述程序的标识,则在所述错误日志中第一行提取所述函数标识。
在另一个实施例中,预定标识还可以包括第二标签,所述第二标签用于标记程序调用失败的函数;所述提取规则还可以包括:
如果查找到所述第一标签、所述应用程序的标识和所述第二标签,则在所述第二标签所在行后查找第一个所述程序的标识,并在第一个所述程序的标识的所在行提取所述函数标识;
如果查找到所述第一标签、所述第二标签,且未查找到所述程序的标识,则在所述第二标签所在行的下一行提取所述函数标识。
另外,提取规则还可以包括:
如果查找到第二标签和所述程序的标识,且未查找到所述第一标签,则在所述第二标签所在行的下一行提取所述函数标识;
如果查找到所述第二标签,且未查找到所述第一标签和所述应用程序的标识,则在所述第二标签所在行的下一行提取所述函数标识。
第二标签可以是Exception Backtrace标记。
上述装置中各个单元的功能和作用的实现过程具体详见上述方法中对应步骤的实现过程,在此不再赘述。
对于装置实施例而言,由于其基本对应于方法实施例,所以相关之处参见方法实施例的部分说明即可。以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本申请方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。
以上所述仅为本申请的较佳实施例而已,并不用以限制本申请,凡在本申请的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本申请保护的范围之内。