CN112540808B - 一种程序行为层级调用关系的记录方法及相关设备 - Google Patents
一种程序行为层级调用关系的记录方法及相关设备 Download PDFInfo
- Publication number
- CN112540808B CN112540808B CN201910900926.9A CN201910900926A CN112540808B CN 112540808 B CN112540808 B CN 112540808B CN 201910900926 A CN201910900926 A CN 201910900926A CN 112540808 B CN112540808 B CN 112540808B
- Authority
- CN
- China
- Prior art keywords
- identifier
- thread
- machine
- calling
- variable
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/448—Execution paradigms, e.g. implementations of programming paradigms
- G06F9/4482—Procedural
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Debugging And Monitoring (AREA)
Abstract
本申请公开了一种程序行为层级调用关系的记录方法、装置、服务器及存储介质,本申请在监测到程序行为的情况下,获得程序行为对应的机器标识、进程标识和线程标识;至少基于程序行为对应的机器标识、进程标识和线程标识,获得程序行为对应的行为日志;其中,行为日志中包括调用标识符,调用标识符唯一表征程序行为的调用层级。可见,本申请中不再依赖于开发人员的手动编写,而是利用程序行为对应的机器标识、进程标识和线程标识来自动生成程序行为的行为日志,由此利用调用标识符来唯一表征程序行为的调用层级,使得日志中程序行为的层级调用关系简洁且清楚,由此提高后续日志分析的准确率。
Description
技术领域
本申请涉及软件开发技术领域,尤其涉及一种程序行为层级调用关系的记录方法及相关设备。
背景技术
在软件研发过程中,程序行为之间层级调用关系是分析程序行为的重要信息,可以用以快速定位并解决相关的问题。
目前程序行为的层级调用关系依赖于开发人员在程序行为日志的基础上进行手动编写,用于后续分析程序行为。
而随着软件系统的复杂度的提高,使得跨机器、多进程、多线程的应用程序得到普及,使得开发人员手动编写的不同机器、不同进程及不同线程的程序行为的日志混杂在一起,导致在后续进行日志分析时会存在由于日志混乱引起层级调用关系混乱的情况,由此使得日志分析的准确率较低。
发明内容
有鉴于此,本申请提供一种程序行为层级调用关系的记录方法及相关设备,用以提高日志分析的准确性。
为实现上述目的,一方面,本申请提供了一种程序行为层级调用关系的记录方法,包括:
在监测到程序行为的情况下,获得所述程序行为对应的机器标识、进程标识和线程标识;
至少基于所述程序行为对应的机器标识、进程标识和线程标识,获得所述程序行为对应的行为日志;其中,所述行为日志中包括调用标识符,所述调用标识符唯一表征所述程序行为的调用层级,所述调用标识符用于输出程序行为内容,所述程序行为内容包括至少一个调用程序标识,且所述调用程序标识在所述程序行为内容中的输出位置与所述调用程序标识对应的行为日志中的调用标识符相关联。
在一种可能的实现方式中,所述至少基于所述程序行为所对应的机器标识、进程标识和线程标识,获得所述程序行为对应的行为日志,包括:
基于所述机器标识、进程标识和线程标识,获得所述程序行为对应的调用标识符;
至少基于所述调用标识符,生成所述程序行为对应的行为日志。
可选的,所述基于所述机器标识、进程标识和线程标识,获得所述程序行为对应的调用标识符,包括:
在机器集合中,获得与所述机器标识、所述进程标识和所述线程标识相关联的目标线程变量;
其中,所述机器集合中包括机器变量及所述机器变量对应的进程集合,所述进程集合中包括进程变量及所述进程变量对应的线程集合,所述线程集合中包括线程变量及所述线程变量对应的日志标识、当前调用层级和调用变量,所述调用变量之间按照其生成时对应的调用层级排序,所述调用变量表明在对应的调用层级上的调用次序;
获得所述目标线程变量中的日志标识作为所述程序行为的日志标识;
至少基于所述目标线程变量对应的调用变量,生成所述程序行为的层级标识;
至少基于所述日志标识和所述层级标识,生成所述程序行为对应的调用标识符。
可选的,所述基于所述目标线程变量对应的调用变量,生成所述程序行为的层级标识,包括:
按照所述目标线程变量对应的调用变量之间的顺序,将所述调用变量通过连接符进行组合,以生成所述程序行为的层级标识。
在一种可能的实现方式中,所述机器集合中的内容通过以下方式处理:
在监测到程序行为开始的情况下,在机器集合中,查找是否存在与所述机器标识相对应的机器变量;
若在所述机器集合中不存在与所述机器标识对应的机器变量,在所述机器集合中创建所述机器标识对应的机器变量及其对应的进程集合;
在所述机器集合中与所述机器标识对应的机器变量对应的进程集合中,查找是否存在与所述进程标识相对应的进程变量;
若在所述进程集合中不存在与所述进程标识对应的进程变量,在所述进程集合中创建所述进程标识对应的进程变量及其对应的线程集合;
在所述机器集合中与所述机器标识和所述进程标识对应的线程集合中,查找是否存在与所述线程标识相对应的线程变量;
若在所述机器标识和所述进程标识对应的线程集合中不存在与所述线程标识对应的线程变量,在所述线程集合中创建所述线程标识对应的线程变量并生成所述线程变量对应的日志标识,设置所述线程变量对应的当前调用层级递增1,所述当前调用层级在所述线程变量被创建时的初始值为0;
若在所述机器标识和所述进程标识对应的线程集合中存在与所述线程标识对应的线程变量且所述线程变量对应的当前调用层级为0,设置所述线程变量对应的当前调用层级递增1;
若在所述机器标识和所述进程标识对应的线程集合中存在与所述线程标识对应的线程变量且所述线程变量对应的当前调用层级非0,在所述线程集合中生成所述线程标识在所述当前调用层级上对应的调用变量,并设置所述线程变量对应的当前调用层级递增1,其中,生成的调用变量相对于上一个程序行为在当前调用层级上对应的调用变量递增1。
可选的,所述机器集合中的内容还通过以下方式处理:
在监测到程序行为结束的情况下,在所述机器标识和所述进程标识对应的线程集合中,将与所述线程标识对应的线程变量中的当前调用层级递减1;
若所述当前调用层级小于所述调用变量的数量,将所述当前调用层级对应的调用变量删除,用于下一个程序行为在当前调用层级上的调用变量的处理。
可选的,所述方法还包括:
获得输出参数,所述输出参数包括机器参数、进程参数和线程参数中的任意一种或任意多种的组合;
获得所述输出参数对应的至少一个行为日志;
至少基于所述行为日志中的调用标识符,输出程序行为内容;
其中,所述程序行为内容包括至少一个调用程序标识,且所述调用程序标识在所述程序行为内容中的输出位置与所述调用程序标识对应的行为日志中的调用标识符相关联。
又一方面,本申请还提供了一种程序行为层级调用关系的记录装置,包括:
行为监测单元,用于监测程序行为;
参数获得单元,用于在所述行为监测单元监测到程序行为的情况下,获得所述程序行为对应的机器标识、进程标识和线程标识;
日志生成单元,用于至少基于所述程序行为对应的机器标识、进程标识和线程标识,获得所述程序行为对应的行为日志;其中,所述行为日志中包括调用标识符,所述调用标识符唯一表征所述程序行为的调用层级,所述调用标识符用于输出程序行为内容,所述程序行为内容包括至少一个调用程序标识,且所述调用程序标识在所述程序行为内容中的输出位置与所述调用程序标识对应的行为日志中的调用标识符相关联。
在一种可能的实现方式中,所述日志生成单元在获得所述程序行为对应的行为日志时,通过以下方式实现:
基于所述机器标识、进程标识和线程标识,获得所述程序行为对应的调用标识符;
至少基于所述调用标识符,生成所述程序行为对应的行为日志。
可选的,所述日志生成单元在获得所述程序行为对应的调用标识符时,通过以下方式实现:
在机器集合中,获得与所述机器标识、所述进程标识和所述线程标识相关联的目标线程变量;
其中,所述机器集合中包括机器变量及所述机器变量对应的进程集合,所述进程集合中包括进程变量及所述进程变量对应的线程集合,所述线程集合中包括线程变量及所述线程变量对应的日志标识、当前调用层级和调用变量,所述调用变量之间按照其生成时对应的调用层级排序,所述调用变量表明在对应的调用层级上的调用次序;
获得所述目标线程变量中的日志标识作为所述程序行为的日志标识;
至少基于所述目标线程变量对应的调用变量,生成所述程序行为的层级标识;
至少基于所述日志标识和所述层级标识,生成所述程序行为对应的调用标识符。
可选的,所述日志生成单元生成所述程序行为的层级标识时,通过以下方式实现:
按照所述目标线程变量对应的调用变量之间的顺序,将所述调用变量通过连接符进行组合,以生成所述程序行为的层级标识。
在一种可能的实现方式中,所述机器集合中的内容通过以下方式处理:
在监测到程序行为开始的情况下,在机器集合中,查找是否存在与所述机器标识相对应的机器变量;
若在所述机器集合中不存在与所述机器标识对应的机器变量,在所述机器集合中创建所述机器标识对应的机器变量及其对应的进程集合;
在所述机器集合中与所述机器标识对应的机器变量对应的进程集合中,查找是否存在与所述进程标识相对应的进程变量;
若在所述进程集合中不存在与所述进程标识对应的进程变量,在所述进程集合中创建所述进程标识对应的进程变量及其对应的线程集合;
在所述机器集合中与所述机器标识和所述进程标识对应的线程集合中,查找是否存在与所述线程标识相对应的线程变量;
若在所述机器标识和所述进程标识对应的线程集合中不存在与所述线程标识对应的线程变量,在所述线程集合中创建所述线程标识对应的线程变量并生成所述线程变量对应的日志标识,设置所述线程变量对应的当前调用层级递增1,所述当前调用层级在所述线程变量被创建时的初始值为0;
若在所述机器标识和所述进程标识对应的线程集合中存在与所述线程标识对应的线程变量且所述线程变量对应的当前调用层级为0,设置所述线程变量对应的当前调用层级递增1;
若在所述机器标识和所述进程标识对应的线程集合中存在与所述线程标识对应的线程变量且所述线程变量对应的当前调用层级非0,在所述线程集合中生成所述线程标识在所述当前调用层级上对应的调用变量,并设置所述线程变量对应的当前调用层级递增1,其中,生成的调用变量相对于上一个程序行为在当前调用层级上对应的调用变量递增1。
可选的,所述机器集合中的内容还通过以下方式处理:
在监测到程序行为结束的情况下,在所述机器标识和所述进程标识对应的线程集合中,将与所述线程标识对应的线程变量中的当前调用层级递减1;
若所述当前调用层级小于所述调用变量的数量,将所述当前调用层级对应的调用变量删除,用于下一个程序行为在当前调用层级上的调用变量的处理。
可选的,所述装置还包括:
内容输出单元,用于获得输出参数,所述输出参数包括机器参数、进程参数和线程参数中的任意一种或任意多种的组合;获得所述输出参数对应的至少一个行为日志;至少基于所述行为日志中的调用标识符,输出程序行为内容;其中,所述程序行为内容包括至少一个调用程序标识,且所述调用程序标识在所述程序行为内容中的输出位置与所述调用程序标识对应的行为日志中的调用标识符相关联。
又一方面,本申请还提供了一种服务器,包括:
处理器和存储器;
其中,所述处理器用于执行所述存储器中存储的程序;
所述存储器用于存储程序,所述程序至少用于:
在监测到程序行为的情况下,获得所述程序行为对应的机器标识、进程标识和线程标识;
至少基于所述程序行为对应的机器标识、进程标识和线程标识,获得所述程序行为对应的行为日志;其中,所述行为日志中包括调用标识符,所述调用标识符唯一表征所述程序行为的调用层级,所述调用标识符用于输出程序行为内容,所述程序行为内容包括至少一个调用程序标识,且所述调用程序标识在所述程序行为内容中的输出位置与所述调用程序标识对应的行为日志中的调用标识符相关联。
又一方面,本申请还提供了存储介质,所述存储介质中存储有计算机可执行指令,所述计算机可执行指令被处理器加载并执行时,实现如上任一项所述的程序行为层级调用关系的记录方法。
由上述方案可知,本申请所提供的一种程序行为层级调用关系的记录方法、装置服务器及存储介质,在监测到程序行为的情况下,通过获取程序行为对应的机器标识、进程标识、线程标识等,进而基于这些标识来获得程序行为对应的行为日志,而在行为日志中以调用标识符来唯一表征程序行为的调用层级。可见,本申请中不再依赖于开发人员的手动编写,而是利用程序行为对应的机器标识、进程标识和线程标识来自动生成程序行为的行为日志,以避免多机器、多进程、多线程的程序行为的日志混杂在一起导致层级关系混乱的情况,由此利用调用标识符来唯一表征程序行为的调用层级,使得日志中程序行为的层级调用关系简洁且清楚,由此提高后续日志分析的准确率。
附图说明
为了更清楚地说明本申请实施例的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1示出了本申请实施例的一种程序行为层级调用关系的记录系统的组成框架示意图;
图2示出了本申请实施例的一种实现程序行为层级调用关系的记录的开发服务器的硬件组成结构示意图;
图3示出了本申请实施例的一种程序行为层级调用关系的记录方法的一种流程示意图;
图4示出了本申请实施例中机器、进程、线程和程序之间的关系的示意图;
图5示出了本申请实施例中机器集合中的内容示意图;
图6示出了本申请实施例中展示程序行为的层级调用关系的示意图;
图7示出了本申请实施例中开发服务器生成行为日志并展示程序行为之间的层级调用关系的系统架构图;
图8示出了本申请实施例中程序行为的层级关系增加的流程示意图;
图9示出了本申请实施例中程序行为的层级关系减少的流程示意图;
图10示出了本申请实施例中拼接出level_id的流程示意图;
图11示出了本申请实施例的一种程序行为层级调用关系的记录装置一个实施例的组成结构示意图。
具体实施方式
本申请的方案可以利用程序行为对应的机器标识、进程标识和线程标识自动生成程序行为的行为日志,并在行为日志中通过调用标识符来唯一表征程序行为的调用层级,使得日志中程序行为的层级调用关系简洁且清楚,由此提高后续日志分析的准确率。
其中,程序行为是指软件开发过程中,程序的运行行为、程序之间的调用或被调用行为等,例如,程序A运行,程序A依次调用程序B和程序E,程序B又调用程序C和程序D,其中,程序A调用程序B的行为、程序B调用程序C的行为等,均可以称为一次程序行为。
本文中的程序可以理解为软件开发过程中的各个程序代码段,如函数或函数组成的模块等,程序行为可以理解为函数或模块之间的行为,如函数之间的调用行为、模块之间的调用行为或函数和模块之间的调用行为等。而函数或模块等程序之间的调用层级关系是程序运行时程序行为的重要信息,开发人员可以通过分析这些程序行为能够快速定位相关问题并予以解决。
本申请的发明人在经过研究后发现:目前程序行为是由程序员等开发人员手动编写代码,并以输出日志的方式进行记录,进而将程序的关键行为记录到日志文件中,这些日志文件用于后续的分析解读。但随着软件系统的复杂性的提升,诸如单机的多进程多线程的应用程序以及跨机器分布式的应用程序等使用越来越广泛,如果按照传统的手动编写代码写入日志的方式来记录程序行为,就会出现很多问题,例如日志内会被多进程、多线程的内容交织,导致日志中各种程序行为的层级调用关系交织在一起,即使是单机单进程单线程模式,依然会存在记录的不同的程序行为的层级调用关系交织到一起的情况,如果不能对日志中程序行为的层级调用关系进行区分记录,那么在后续日志分析解读中,将无法按照机器、进程、线程或模块等粒度进行分析,进而导致日志分析错误,由此降低日志分析的准确率。
而本申请的发明人进一步进行研究发现,程序行为在进行时,运行系统会自动识别程序行为发生时所处的机器、进程及线程,由此,为了避免日志混杂,可以通过读取程序行为对应的机器标识、进程标识及线程标识等来生成相应程序行为对应的行为日志,而行为日志中以调用标识符来唯一表征程序行为的调用层级,由此,利用调用标识符使得行为日志在日志服务器中能够被准确识别,而且利用调用标识符使得程序行为的调用层级更加简洁清楚,由此,日志服务器中的日志内程序行为的层级调用关系通过日志中的调用标识符进行区分记录,日志内容不会因为多机器、多进程、多线程而出现交织混杂在一起,由此日志中各种程序行为的层级调用关系就不会交织混杂,那么在后续日志分析解读中,就可以按照需求准确定位到相应的日志,进一步的可以按照机器、进程、线程或模块等粒度进行分析,进而能够准确实现日志测分析,由此提高日志分析的准确率。
为了便于理解,本文中先对本申请的方案所适用的系统进行介绍,参考图1,其示出了本申请一种程序行为层级调用关系的记录系统的一种组成架构示意图。
由图1中可知,该系统中可以包括有:开发服务器10、测试服务器20、应用服务器30、日志服务器40和终端50,开发服务器10、测试服务器20、应用服务器30、日志服务器40和终端50之间通过网络实现通信连接。
其中,开发服务器10用于对软件应用进行开发,开发服务器10中可以搭建有开发环境,开发人员可以在开发服务器10中进行代码编写、代码运行等开发任务,在开发完成后,将软件应用传输到测试服务器20中进行应用测试,以及时发现软件应用中的缺陷,再进一步在开发服务器10上进行修改或进一步开发等任务。在软件应用开发完成后,软件应用可以通过产品上载等方式,将软件应用传输到应用服务器30上,以提供给用户通过终端50在应用服务器进行下载并运行,由此通过运行软件应用为用户提供相应的服务,如视频聊天或购物等功能服务。
需要说明的是,在开发服务器10对软件应用进行开发过程中,软件应用中的各种函数或模块之间的调用行为可以通过日志记录的方式存储到日志服务器40中,由此在日志服务器40中存储软件应用开发过程中所有程序行为对应的行为日志,用以后续日志分析。
需要说明的是,以上是以各服务器分别为一台独立的服务器为例进行说明,但是可以理解的是,在实际应用中,开发服务器也可以被替换为开发服务器集群,或者由多台开发服务器构成的分布式集群,测试服务器和日志服务器也可以集成到服务器集群中。
其中,为了实现各服务器上相应的功能,服务器的存储器中需要存储实现相应功能的程序。为了便于理解各个服务器的硬件构成,下面以开发服务器为例进行介绍。如图2中所示,为本申请的开发服务器的一种组成结构示意图,本实施例中的开发服务器10可以包括有:处理器201、存储器202、通信接口203、输入单元204、显示器205和通信总线206。
其中,处理器201、存储器202、通信接口203、输入单元204、显示器205、均通过通信总线206完成相互间的通信。
在本实施例中,该处理器201,可以为中央处理器(Central Processing Unit,CPU),特定应用集成电路,数字信号处理器、现成可编程门阵列或者其他可编程逻辑器件等。
该处理器201可以调用存储器202中存储的程序。具体的,处理器201可以执行以下程序行为层级调用关系的记录方法的实施例中开发服务器侧所执行的操作。
存储器202中用于存放一个或者一个以上程序,程序可以包括程序代码,所述程序代码包括计算机操作指令,在本申请实施例中,该存储器中至少存储有用于实现以下功能的程序:
在监测到程序行为的情况下,获得所述程序行为对应的机器标识、进程标识和线程标识;
至少基于所述程序行为对应的机器标识、进程标识和线程标识,获得所述程序行为对应的行为日志;其中,所述行为日志中包括调用标识符,所述调用标识符唯一表征所述程序行为的调用层级。
在一种可能的实现方式中,该存储器202可以包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、以及至少一个功能(比如层级调用关系展示、日志展示等)所需的应用程序等;存储数据区可存储根据计算机的使用过程中所创建的数据,比如,程序行为的机器标识、进程标识及线程标识和行为日志等等。
此外,存储器202可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件或其他易失性固态存储器件。
该通信接口203可以为通信模块的接口,如GSM模块的接口。
当然,图2所示的开发服务器的结构并不构成对本申请实施例中开发服务器的限定,在实际应用中开发服务器可以包括比图2所示的更多或更少的部件,或者组合某些部件。
可以理解的是,测试服务器、应用服务器及日志服务器与开发服务器的硬件组成相似,不同之处仅在于测试服务器、应用服务器及日志服务器中处理器执行的操作,以及存储器中存储的程序不同。
结合以上共性,参考图3,其示出了本申请一种程序行为层级调用方法的记录方法一个实施例的流程示意图,本实施例中的方法可以包括有:
S301:在监测到程序行为的情况下,获得程序行为对应的机器标识、进程标识和线程标识。
其中,本实施例中监测到程序行为可以理解为监测到有程序之间的调用行为,如程序A调用程序B的行为,此时,获得程序行为对应的机器标识、进程标识和线程标识。
需要说明的是,机器、进程、线程和程序之间的关系可以参考图4中所示:在软件应用的开发过程中,可能涉及多个机器,每个机器下可以运行多个进程,每个进程中可以分为多个线程,每个线程中可以运行多个程序,由此,程序行为可能发生在多个机器中的其中一个机器下的其中一个进程中的某个线程中。因此,本实施例中在监测到程序行为时,可以对程序行为对应的机器标识、进程标识和线程标识进行获取。
在一种实现方式中,本实施例中可以利用程序行为所在的开发服务器系统的应用程序编程接口API(Application Programming Interface)来获取到当前的程序行为所在的机器标识,并获得在该机器标识所对应的机器的多个进程中程序行为所在的进程标识,并获得在该进程标识所对应的进程的多个线程中程序行为所在的线程标识。
具体的,机器标识可以为程序行为所对应的机器网络协议地址IP(InternetProtocol Address),进程标识可以为程序行为所对应的进程ID(identification),这里的进程ID可以是创建该进程时为进程所分配的ID,以唯一标识该进程;线程标识可以为程序行为所对应的线程ID,这里的线程ID可以是创建该线程时为线程所分配的ID,以唯一标识该线程。
可选的,本实施例中除了获得程序行为对应的机器标识、进程标识和线程标识,还可以获得程序行为相关的其他信息。
S302:至少基于程序行为对应的机器标识、进程标识和线程标识,获得程序行为对应的行为日志。
其中,行为日志中包括有调用标识符,该调用标识符能够唯一表征程序行为的调用层级。
在一种可能的实现方式中,本实施例中可以将机器标识、进程标识和线程标识进行组合,或者进一步的,在机器标识、进程标识和线程标识组合得到的字符串进行处理得到调用标识符,并在调用标识符的基础上生成程序行为对应的行为日志。
在另一种可能的实现方式中,本实施例中可以首先基于所述机器标识、进程标识和线程标识,获得所述程序行为对应的调用标识符;再基于所述调用标识符,生成所述程序行为对应的行为日志。
例如,本实施例中可以先将机器标识、进程标识和线程标识进行组合,再在机器标识、进程标识和线程标识的基础上获得程序行为对应的调用标识符,之后,再在调用标识符和机器标识、进程标识和线程标识的基础上生成程序行为的行为日志。
可选的,本实施例中可以将调用标识符与机器标识、进程标识和线程标识一起通过符号如“|”等连接在一起,写入到程序行为的行为日志中。
另外,本实施例中还可以将时间戳一起写入到行为日志中,其中的时间戳可以为行为日志的输出时间,包括日期及时刻(时刻可以精确到秒);可选的,本实施例中还可以将行为日志的日志级别写入到行为日志中,如debug、info、wran或error等日志级别;可选的,本实施例中还可以将自定义的日志内容写入到行为日志中,这里自定义的内容是指与程序行为所关联的程序对应的内容,具体可以根据程序本身的内容决定,如函数名称等。
具体的,本实施例中的行为日志可以具有以下的日志格式:
[时间戳]|日志级别|机器IP|进程ID|线程ID|调用标识符|自定义内容
例如,按照以上的日志格式输出一条行为日志:
[2018-12-20 14:56:04.025]|info|192.168.19.1|3776|main(1)|3-x.1|com.xx.aa()
在一种可能的实现方式中,本实施例中在基于所述机器标识、进程标识和线程标识,获得所述程序行为对应的调用标识符时,可以利用在程序行为进行中所生成的机器集合中的内容实现,其中:
在机器集合中包括一个或多个机器变量及每个机器变量对应的进程集合,如图5中所示,每个进程集合中分别包括一个或多个进程变量及每个进程变量对应的线程集合,每个线程集合中包括一个或多个线程变量及每个线程变量对应的日志标识、当前调用层级和调用变量,其中,线程变量在每个调用层级上对应有调用变量,调用变量之间按照其生成时所对应的调用层级排序,调用变量能够用于表明对应的调用层级上的调用次序。
具体的,线程变量对应的日志标识可以为按照随机算法所生成的全局唯一标识符guid值,该guid值可以通过字符串表示,同一机器下同一进程中的同一线程上的程序行为的guid值相同;
当前调用层级可以理解为程序行为在软件应用中所处的行为层级,也可以称为当前调用深度,例如A调用B且B调用C中,A调用B的行为为第1调用层级,调用深度为1,B调用C的行为为第2调用层级,调用深度为2,等等;
调用变量中可以以数字表示在调用层级上的调用次序,如1或2等表示第1调用层级上的第1或第2个调用次序,或者,调用变量也可以以向量的形式将调用层级和调用次序均进行记录,如{a,b},其中a为调用层级,b为调用层级a上的调用次序。
需要说明的是,调用变量的数量与程序行为的调用深度相关,如果有1个调用变量,表明程序行为在第1调用层级,如果有两个调用变量,表明程序行为在第2调用层级(调用深度)。例如,如果a为2,那么该调用变量上的b表示程序行为在第2调用层级上的调用次序,而a为2对应的调用变量之前还有一个a为1的调用变量,即有两个调用变量,例如{1,1}和{2,2},此时表征程序行为在第2调用层级的第2调用次序,在该程序行为之前,有两个其他程序行为,分别为在第1调用层级上的第1调用次序的行为和在第2调用层级上的第2调用次序的行为。
相应的,本实施例中在获得程序行为对应的调用标识符时,具体可以通过以下方式实现:
首先,在机器集合中获得与机器标识、进程标识和线程标识相关联的目标线程变量,如果在机器集合中没有查找到机器标识、进程标识和线程标识均相关联的目标线程变量,那么表明该程序行为的三个标识出现错误或者机器集合中出现错误,此时,返回错误信息。
之后,获得目标线程变量中的日志标识作为该程序行为的日志标识;
并且,至少基于目标线程变量对应的调用变量生成程序行为的层级标识,可选的,按照目标线程变量对应的调用变量在生成时所对应的调用层级,即按照目标线程变量对应的调用变量之间的顺序,将目标线程变量对应的调用变量中的调用次序通过连接符进行组合,以生成程序行为的层级标识。具体的,目标线程变量具有一个或多个调用变量,其中调用变量以数字标识在相应调用层级上的调用次序,例如,调用变量为1个:2时,此时表明程序行为在第1调用层级上的第2调用次序,再如,调用变量为2个,分别为2和3时,表明程序行为在第2调用层级上的第3调用次序,再如,调用变量为3个,分别为2、4、1时,表明程序行为在第3调用层级上的第1调用次序上;或者,调用变量可以以包含两个分量的向量表示在调用层级上的调用次序,例如,调用变量为1个如{1,2}时,表明程序行为在第1调用层级上的第2调用次序,再如,调用变量为2个,分别{1,1}和{2,2}时,此时表征程序行为在第2调用层级的第2调用次序,再如,调用变量为3个,分别为{1,2}、{2,4}和{3,1}时,表明程序行为在第3调用层级上的第1调用次序上,等等。相应的,本实施例中按照目标线程变量中各个调用变量对应的调用层级的顺序,将调用变量中表明调用次序的数值通过连接符如“.”等进行连接组合,以得到程序行为的层级标识,例如,目标线程变量中的调用变量为{1,2}时,程序行为的层级标识为2,再如,调用变量为2个,分别{1,1}和{2,2}时,程序行为的层级标识为:1.2,再如,调用变量为3个,分别为{1,2}、{2,4}和{3,1}时,程序行为的层级标识为2.4.1,等等。
最后,至少基于日志标识和层级标识,生成程序行为对应的调用标识符。例如,将日志标识guid值和层级标识通过连接符如“.”进行连接组合,以得到有日志标识和层级标识组成的调用标识符,该调用标识符能够唯一标识程序行为,也能够唯一标识程序行为的调用层级。
在一种可能的实现方式中,以上机器集合中的内容是在程序行为进行过程中执行相应的操作所形成的,具体可以参考如下实现方式:
首先,在监测到程序行为开始的情况下,在机器集合中,查找是否存在与机器标识相对应的机器变量,如果在机器集合中不存在机器标识对应的机器变量,表明程序行为所在的机器为相对于机器集合的新机器,此时在机器集合中创建机器标识对应的机器变量,并创建该机器变量对应的进程集合,此时初始创建的进程集合为空;
之后,如果在机器集合中存在机器标识对应的机器变量(可以为机器集合中原有的机器变量,也可以为新创建的机器变量),此时,在该机器变量对应的进程集合中查找是否存在与进程标识相对应的进程变量,如果在该机器变量对应的进程集合中不存在与进程标识相对应的进程变量,表明程序行为所在的进程为相对于进程集合的新进程,此时在该进程集合中创建进程标识对应的进程变量,并创建该进程变量对应的线程集合,此时初始创建的线程集合为空;
之后,如果在进程集合中存在与进程标识相对应的进程变量(可以为进程集合中原有的进程变量,也可以为新创建的进程变量),此时,在该进程变量对应的线程集合中查找是否存在与线程标识相对应的线程变量,如果在该进程变量对应的线程集合中不存在与线程标识相对应的线程变量,表明程序行为所在的线程为相对于线程集合的新线程,此时在线程集合中创建线程标识对应的线程变量,并生成线程标识对应的日志标识,相应的,设置该线程变量对应的当前调用层级递增1,其中,初始创建的线程变量中的当前调用层级的初始值为空或为0,相应的,在机器标识、进程标识和线程标识下的程序行为被判断为第一次出现时,创建新的线程变量后,设置线程变量的当前调用层级在0的基础上加1,表示程序行为在第1调用层级;
进一步的,如果在机器标识和进程标识对应的线程集合中存在与线程标识对应的线程变量,那么对线程变量中对应的当前调用层级是否为0进行判断,如果当前调用层级为0,那么设置线程变量对应的当前调用层级递增1,如果当前调用层级非0,那么在线程集合中生成线程标识在当前调用层级上的调用变量,并设置线程变量对应的当前调用层级递增1,其中,生成的调用变量相对上一个程序行为在当前调用层级上对应的调用变量递增1,如果当前的程序行为是当前调用层级上的第一个程序行为,那么调用变量从0上加1,如果当前程序行为之前有上一个程序行为,那么当前的程序行为的调用变量即表明调用次序的值在上一个程序行为在当前调用层级上对应的调用变量的基础上递增1,即增加一个调用次序。例如,如果上一个程序行为在当前调用层级上的调用变量中表明调用次序的值为1,那么设置当前的程序行为在当前调用层级上的调用变量为2,以表明当前的程序行为是当前调用层级上的第二个调用次序。
最后,在监测到程序行为结束的情况下,在机器标识和进程标识对应的线程集合中,将与线程标识对应的线程变量中的当前调用层级递减1,并进一步判断当前调用层级中的所有程序行为是否均结束,即刚结束的程序行为是否为当前调用层级中的最后一个程序行为,具体可以通过判断当前调用层级是否小于调用变量的数量,如果当前调用层级已经小于调用变量的数量,那么表明当前调用层级已经因为程序行为的结束回到程序行为所对应的前一级调用层级上,此时可以将程序行为的调用变量中与当前调用层级对应的调用变量进行删除,删除与当前调用层级对应的调用变量后的程序行为的调用变量用于下一个程序行为开始时在当前调用层级上的调用变量的处理,当然,当前的程序行为的调用变量仍为删除与当前调用层级对应的调用变量之前的调用变量。
由此,本实施例中在程序行为开始和结束时通过对当前调用层级和调用变量进行记录,从而在后续进行日志生成时,就可以利用当前调用层级和调用变量中表明调用次序的值来生成相应的层级标识,并结合日志标识生成程序行为对应的调用标识符,进而生成程序行为的行为日志。
步骤S303:获得输出参数以及输出参数对应的至少一个行为日志,至少基于行为日志中的调用标识符,输出程序行为内容。
其中,输出参数中可以包括有机器参数、进程参数和线程参数中的一种或任意多种的组合,以表征需要展示的相应粒度下的程序行为的层级调用关系。例如,输出参数可以为空,表征需要展示所有程序行为的层级调用关系,或者,输出参数可以只包括机器参数,表征只需要展示该机器参数对应的各个程序行为之间的层级调用关系,或者,输出参数中可以包括机器参数和进程参数,表征只需要展示该机器参数对应的各个程序行为中与该进程参数所对应的程序行为之间的层级调用关系,或者输出参数中可以包括有机器参数、进程参数和线程参数,表征值需要展示该机器参数对应的各个程序行为中与该进程参数对应的程序行为里面该线程参数所对应的程序行为之间的层级调用关系,由此,本实施例中可以通过对输出参数进行配置,来决定输出程序行为的层级调用关系的粒度。
需要说明的是,程序行为内容中包括至少一个调用程序标识,如参与程序行为的程序名称如函数名称等,且调用程序标识在程序行为内容中的输出位置与调用程序标识对应的行为日志中的调用标识符相关联。
具体的,本实施例中在利用输出参数获得相应的程序行为的行为日志之后,通过对行为日志中的调用标识符进行解析,生成并输出程序行为内容,在程序行为内容中调用程序标识的输出位置与调用标识符中所表征的调用层级相对应。
可选的,在程序行为内容中调用程序标识的输出位置除了与调用标识符中所表征的调用层级相对应,还与调用标识符中所表征的在调用层级上的调用次序相对应。
例如,输出参数对应的行为日志中,可以包括有至少一个调用层级的至少一个调用次序上的程序行为的行为日志,因此,在输出程序行为内容时,按照调用层级和调用次序依次输出每个程序行为对应的调用程序标识。例如,某个程序行为在行为日志中的调用标识符中具有日志标识3-x,具有层级标识为:1.2,相应的,该程序行为属于第2调用层级中的第2调用次序,因此,在输出的程序行为内容中,首先输出该程序行为之前的第1调用层级中的各个调用次序上的程序行为对应的调用程序标识和第2调用层级中第1调用次序上的程序行为对应的调用程序标识,之后,再输出层级标识为1.2的这个程序行为对应的调用程序标识。如图6中所示,程序A依次调用程序B和程序E的行为和程序B又调用程序C和程序D的行为所对应的各个行为日志经过日志解析后所输出的程序行为内容,A调用B的行为属于第1调用层级中的第1调用次序,B调用C的行为属于第2调用层级中的第1调用次序,B调用D的行为属于第2调用层级中的第2调用次序,A调用E的行为属于第1调用层级中的第2调用次序,由此按照调用层级和调用次序将各程序行为对应的调用程序标识进行输出。
由上述方案可知,本实施例中在监测到程序行为的情况下,通过获取程序行为对应的机器标识、进程标识、线程标识等,进而基于这些标识来获得程序行为对应的行为日志,而在行为日志中以调用标识符来唯一表征程序行为的调用层级。可见,本实施例中不再依赖于开发人员的手动编写,而是利用程序行为对应的机器标识、进程标识和线程标识来自动生成程序行为的行为日志,以避免多机器、多进程、多线程的程序行为的日志混杂在一起导致层级关系混乱的情况,由此利用调用标识符来唯一表征程序行为的调用层级,使得日志中程序行为的层级调用关系简洁且清楚,由此提高后续日志分析的准确率。
为了便于理解,以下结合图7中开发服务器生成行为日志并展示程序行为之间的层级调用关系的系统架构图,对本方案在实际应用中的示例进行介绍:
首先,本方案中为了统一标准化分析程序行为,预先对日志格式进行设置,如下格式:
[时间戳]日志级别|机器IP|进程ID|线程名(线程ID)|level_id(调用标识符)|自定义内容
以下为两段程序行为的运行所生成的日志:
[2018-12-2014:56:04.025]|INFO|192.168.19.1|3776|main(1)|1bece7f4-c391-4772-a936-3439ae84482b|com.qq.application.onStart()
[2018-12-2014:56:04.028]|INFO|192.168.19.1|3776|main(1)|1bece7f4-c391-4772-a936-3439ae84482b.1|com.qq.application.init()
[2018-12-2014:56:05.005]|INFO|192.168.19.1|3776|main(1)|1bece7f4-c391-4772-a936-3439ae84482b.1.1|com.qq.transaction_service.init()
[2018-12-2014:56:05.125]|INFO|192.168.19.1|3776|main(1)|1bece7f4-c391-4772-a936-3439ae84482b.1.2|com.qq.info_service.init()
[2018-12-2014:56:06.025]|INFO|192.168.19.1|3776|main(1)|1bece7f4-c391-4772-a936-3439ae84482b.2|com.qq.application.preparedata()
[2018-12-2014:56:06.725]|INFO|192.168.19.1|3776|main(1)|1bece7f4-c391-4772-a936-3439ae84482b.2.1|com.qq.application.saveInitData()
[2018-12-2014:56:07.025]|INFO|192.168.19.1|3776|main(1)|1bece7f4-c391-4772-a936-3439ae84482b.3|com.qq.application.onAccept()
以及
[2018-12-2014:56:08.025]|INFO|192.168.19.1|3776|main(1)|4779bd8a-25a7-4e86-b64d-8c9cd1149f48|com.qq.activity.onAccept()
[2018-12-2014:56:08.028]|INFO|192.168.19.1|3776|main(1)|4779bd8a-25a7-4e86-b64d-8c9cd1149f48.1|com.qq.activity.onLogin()
[2018-12-2014:56:09.005]|INFO|192.168.19.1|3776|main(1)|4779bd8a-25a7-4e86-b64d-8c9cd1149f48.2|com.qq.activity.onLoadData()
[2018-12-2014:56:09.125]|INFO|192.168.19.1|3776|main(1)|4779bd8a-25a7-4e86-b64d-8c9cd1149f48.2.1|com.qq.activity.readLocalData()
[2018-12-2014:56:10.025]|INFO|192.168.19.1|3776|main(1)|4779bd8a-25a7-4e86-b64d-8c9cd1149f48.3|com.qq.activity.showMainPanel()
以下对日志格式中的各字段进行说明:
时间戳:本行日志输出的时间,可以包括日期及时间(可以精确到毫秒);
日志级别:输出日志的级别,一般包括:DEBUG、INFO、WRAN或ERROR等;
机器IP:当前机器的IP地址;
进程ID:当前正在执行的进程ID标识;
线程名(线程ID):在多线程程序中,为了方便识别可以指定线程名称,这里记录线程名称及线程ID到日志中,可以进一步提高人工的可读性;
level_id(调用标识符):当前程序模块的行为层级的标识,遵循如下格式:GUID.X.Y.Z…。其中,GUID(日志标识)是根层级,GUID称为全局唯一标识符(GUID,GloballyUnique Identifier),能够保证全局唯一,保证了日志里每个不同的程序行为能够区别开来;X、Y、Z等均为数字,表示每层调用层级上程序行为的次序的序列号,从1开始编号,每层同级行为的序号递增,层数没有限制;
自定义内容:日志输出的内容,这个由程序自己决定输出的内容。
以上两段行为日志里有两个程序行为被记录下来,1到7行属于第一个程序行为的模块(guid是1bece7f4-c391-4772-a936-3439ae84482b),9到13行属于第二个程序行为的模块(guid是4779bd8a-25a7-4e86-b64d-8c9cd1149f48)。
在采用本方案中的可视化的方式展示如下所示,可以清晰的了解到不同程序行为之间的层级调用关系:
以及
在开发服务器中,本方案中的实现系统可以以软件开发工具包SDK(SoftwareDevelopmentKit)的方式提供,本方案可以基于Java语言实现,以下以Java语言实现为例进行举例说明:
其中,本方案包括三个核心模块:
(1)LogManager日志管理模块,该模块日志提供接口完成将不同机器、不同进程、不同线程的程序行为记录到文件并存储到日志服务器的功能;
(2)BehaviorLevelManager程序行为层级管理模块,该模块跟踪程序行为的层级关系,通过接口返回当前程序行为的层级ID(调用层级),用于记录到日志中;
(3)BehaviorLevelDisplayer程序行为层级展示模块,该模块按照指定的规则如各种输出参数等从日志服务器中获取相关的日志并提取程序行为层级调用关系,进而展示出来。
以下对三个核心模块进行详细介绍:
1、LogManager日志管理模块
该模块日志提供接口完成将不同机器、不同进程、不同线程的程序行为记录下来的功能。对外主要提供如下接口函数:
getInstance():LogManager的实现采用单例模式,即整个系统仅有一个该类的运行实例,getInstance()返回系统中的LogManager的唯一实例;
getBehaviorLevelManager():该接口返回创建的BehaviorLevelManager唯一实例。
getBehaviroLevelDisplayer():该接口返回创建的BehaviorLevelDisplayer唯一实例。
writelog():该接口用于记录程序行为日志,包括参数:日志的级别(logLevel),当前程序行为层级Id(behaviorLevelId),以及自定义的日志内容(content)。同时,机器标识machineId、进程标识processId以及线程标识threadId可以通过接口自动被获取并被写入到相应的行为日志中。behaviorLevelId字段值来自于调用BehaviorLevelManager的getLevelId接口函数。
getLogFile():返回日志的文件对象。
2、BehaviorLevelManager程序行为层级管理模块
该模块跟踪程序行为的层级关系,通过接口返回当前程序行为的层级ID,用于记录到日志中。该模块主要提供如下接口:
getInstance():BehaviorLevelManager实现采用单例模式,即整个系统仅有一个该类的运行实例,getInstance()返回系统中的BehaviorLevelManager的唯一实例。
increaseDepth():该接口在层级关系需要增加的时候被调用,该函数自动记录当前的调用层级的增加。
其中,increaseDepth()的详细流程参见图8中所示,如下:
(1)预先创建机器集合TotalLevelHashMap及其成员变量,该变量用于存储不同机器的不同进程下的不同线程的程序层级调用关系,所以是个四个层级的hashmap。如:
TotalLevelHashMap<线程ID(机器变量),ProcessMap(进程集合)<processId(进程变量),ThreadMap(线程集合)<threadId(线程变量),(guid(日志标识),currentCallDepth(当前调用层级),levelCountMap<int,int>(调用变量,包括调用层级和调用次序)>)>。其中:
第一层级TotalLevelHashMap:该HashMap的key是机器IP,value是对应线程ID的包含所有进程信息的ProcessMap。
第二层级ProcessMap:该HashMap的key是进程ID,value是对应进程的包含所有线程信息的ThreadMap。
第三层级ThreadMap:该HashMap的key是线程ID,value是三个元素的元组,三个元素分别为对应线程的当前程序行为的guid,当前层级深度currentCallDepth以及包含该行为的所有层级信息的levelCountMap。
第四层级levelCountMap:该HashMap的key是程序行为层级,从1开始记录,value是该层级的当前编号,层级编号从1开始(调用次序)。
(2)判断当前机器标识如机器IP是否在机器集合TotalLevelHashMap中,如果不在,说明是第一次遇到该IP,则创建一个该IP对应的空的进程集合如ProcessMap对象。否则,继续。
(3)判断当前进程标识如进程ID是否在ProcessMap中,如果不在,说明是第一次遇到该进程,则创建一个该进程ID对应的线程集合如ThreadMap对象。否则,继续。
(4)判断当前线程标识如线程ID是否在ThreadMap中,如果不在,说明是第一次遇到该线程,则创建一个该线程ID对应的当前调用层级currentCallDepth(值为0)及调用变量如levelCountMap的元组。否则,继续。
(5)判断levelCountMap中记录的当前调用深度(层级)是否为0,如果为0,创建该线程的root节点,分配其日志标识如guid标识,当前调用层级初始化为0。否则,生成并保存调用变量,如保存(key,value)信息到levelCountMap,其中key为当前调用层级,value为之前保存到map的信息中的key对应的value值+1。
并且,以上两种情况均将当前调用层级增加1层,即currentCallDepth值增加1。
(6)程序正常返回。
如下在程序行为运行中关键参数的变化情况所示,Main()函数调用A(),A依次调用B和E,其中,B函数又依次调用C和D。Enter表示进入当前函数,leave表示当前函数执行完毕。其中,Guid是一个长度为36的随机字符串,比如:b2a6e213-d7ec-484f-ba43-ada12b638c00。
decreaseDepth():该接口在调用层级减少的时候被调用,该函数自动记录当前的调用层级的减少。其中,decreaseDepth()的详细流程参见图9中所示,如下:
(1)根据当前机器标识如机器IP、进程标识如进程ID、线程标识如线程ID查找TotalLevelHashMap,判断是否存在对应的ThreadMap,如果不存在,返回错误。否则,继续。
(2)将该线程的当前调用层级减1(currentCallDepth--),即调用层级返回一层。
(3)判断是否当前调用层级的所有子层级都已经执行完毕,即通过判断当前调用层级小于调用变量的数量,如currentCallDepth<levelCountMap.size()是否成立。如果成立,则将该层级的所有子层级信息从levelCountMap中清除。为以后其他层级复用这些子层级编号做好准备。
getLevelId():该接口返回当前机器IP、进程ID及线程ID对应的当前层级的level_id。其中,getLevelId()的详细流程参见图10中所示,如下:
(1)根据当前机器标识如机器IP、进程标识如进程ID、线程标识如线程ID查找TotalLevelHashMap,判断是否存在对应的ThreadMap,如果不存在,返回错误。否则,继续。
(2)从0开始遍历至当前的调用层级,如果是0层级,则使用保存的日志标识如guid值,否则获得日志标识和调用变量并通过点号拼接,例如从levelCountMap获取每个层级的当前value值,用点号拼接起来,返回如前文中所示的日志示例,如1bece7f4-c391-4772-a936-3439ae84482b.2.1。
getLevelId(StringmachineIP,longProcessId,long threadId):返回指定机器IP、指定进程ID及指定线程ID对应的当前层级的level_id。流程与无参数的getLevelId()基本相同,只是机器IP、进程ID以及线程ID用的是传入的参数,而不是自动获取的。
3、BehaviorLevelDisplayer程序行为层级展示模块
该模块按照指定的规则从日志文件中提取相关的程序行为层级调用关系并展示出来。
getInstance():BehaviorLevelDisplayer实现采用单例模式,即整个系统仅有一个该类的运行实例。getInstance()返回系统中的BehaviorLevelDisplayer的唯一实例。
displayBehavior(File logfile):logFile从LogManager的getLogFile()获取到。从logFile中将所有的机器ID下的所有进程ID以及所有线程ID的日志进行提取,并按照前文中所示的展示方式进行依次展示。
displayBehavior(StringmachineIP,File logfile):logFile从LogManager的getLogFile()获取到。从logFile中按照指定的机器ID下的所有进程ID以及所有线程ID,提取出相应的日志,并按照前文中所示的展示方式进行依次展示。
displayBehavior(StringmachineIP,longprocessId,File logfile):logFile从LogManager的getLogFile()获取到。从logFile中按照指定的机器ID下的指定进程ID下的所有线程ID,提取出相应的日志,并按照前文中所示的展示方式进行依次展示。
displayBehavior(String machineIP,longprocessId,long threadId,Filelogfile):logFile从LogManager的getLogFile()获取到。从logFile中按照指定的机器ID下的指定进程ID下的指定的线程ID,提取出相应的日志,并按照前文中所示的展示方式进行依次展示。
综上,本方案提出一种记录程序行为的层级调用关系的方案,可以按照机器、进程、线程以及自定义模块的粒度记录程序的层级调用关系到日志文件中,在后续应用中可以将他们提取出来并以一种可视化的方式展现出来,从而提高日志分析的准确率,并且提升程序行为分析的效率。
又一方面,本申请还提供了一种程序行为层级调用关系的记录装置,如图11中所示,其示出了本申请一种程序行为层级调用关系的记录装置一个实施例的组成示意图,本实施例的装置可以应用于开发服务器,该装置可以包括:
行为监测单元1101,用于监测程序行为;
参数获得单元1102,用于在所述行为监测单元监测到程序行为的情况下,获得所述程序行为对应的机器标识、进程标识和线程标识;
日志生成单元1103,用于至少基于所述程序行为对应的机器标识、进程标识和线程标识,获得所述程序行为对应的行为日志;其中,所述行为日志中包括调用标识符,所述调用标识符唯一表征所述程序行为的调用层级。
内容输出单元1104,用于获得输出参数,所述输出参数包括机器参数、进程参数和线程参数中的任意一种或任意多种的组合;获得所述输出参数对应的至少一个行为日志;至少基于所述行为日志中的调用标识符,输出程序行为内容;
其中,所述程序行为内容包括至少一个调用程序标识,且所述调用程序标识在所述程序行为内容中的输出位置与所述调用程序标识对应的行为日志中的调用标识符相关联。
另一方面,本申请实施例还提供了一种存储介质,所述存储介质中存储有计算机可执行指令,所述计算机可执行指令被处理器加载并执行时,实现如上任意一个实施例中开发服务器侧所执行的程序行为层级调用关系的记录方法。
在一些实施例中,上述终端或服务器可以是一个分布式系统中的一个节点,其中,该分布式系统可以为区块链系统,该区块链系统可以是由该多个节点通过网络通信的形式连接形成的分布式系统。其中,节点之间可以组成点对点(P2P,Peer To Peer)网络,任意形式的计算设备,比如服务器、终端等电子设备都可以通过加入该点对点网络而成为该区块链系统中的一个节点。
需要说明的是,本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。对于装置类实施例而言,由于其与方法实施例基本相似,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
最后,还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括要素的过程、方法、物品或者设备中还存在另外的相同要素。
对所公开的实施例的上述说明,使本领域技术人员能够实现或使用本发明。对这些实施例的多种修改对本领域技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本发明的精神或范围的情况下,在其它实施例中实现。因此,本发明将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。
以上仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。
Claims (9)
1.一种程序行为层级调用关系的记录方法,其特征在于,包括:
在监测到程序行为的情况下,获得所述程序行为对应的机器标识、进程标识和线程标识;
至少基于所述程序行为对应的机器标识、进程标识和线程标识,获得所述程序行为对应的行为日志;
其中,所述行为日志中包括调用标识符,所述调用标识符唯一表征所述程序行为的调用层级,所述调用标识符用于输出程序行为内容,所述程序行为内容包括至少一个调用程序标识,且所述调用程序标识在所述程序行为内容中的输出位置与所述调用程序标识对应的行为日志中的调用标识符相关联;
所述调用标识符是利用机器集合中的内容实现的,所述机器集合中的内容通过以下方式处理:
在监测到程序行为开始的情况下,在机器集合中,查找是否存在与所述机器标识相对应的机器变量;
若在所述机器集合中不存在与所述机器标识对应的机器变量,在所述机器集合中创建所述机器标识对应的机器变量及其对应的进程集合;
在所述机器集合中与所述机器标识对应的机器变量对应的进程集合中,查找是否存在与所述进程标识相对应的进程变量;
若在所述进程集合中不存在与所述进程标识对应的进程变量,在所述进程集合中创建所述进程标识对应的进程变量及其对应的线程集合;
在所述机器集合中与所述机器标识和所述进程标识对应的线程集合中,查找是否存在与所述线程标识相对应的线程变量;
若在所述机器标识和所述进程标识对应的线程集合中不存在与所述线程标识对应的线程变量,在所述线程集合中创建所述线程标识对应的线程变量并生成所述线程变量对应的日志标识,设置所述线程变量对应的当前调用层级递增1,所述当前调用层级在所述线程变量被创建时的初始值为0;
若在所述机器标识和所述进程标识对应的线程集合中存在与所述线程标识对应的线程变量且所述线程变量对应的当前调用层级为0,设置所述线程变量对应的当前调用层级递增1;
若在所述机器标识和所述进程标识对应的线程集合中存在与所述线程标识对应的线程变量且所述线程变量对应的当前调用层级非0,在所述线程集合中生成所述线程标识在所述当前调用层级上对应的调用变量,并设置所述线程变量对应的当前调用层级递增1,其中,生成的调用变量相对于上一个程序行为在当前调用层级上对应的调用变量递增1。
2.根据权利要求1所述的方法,其特征在于,至少基于所述程序行为对应的机器标识、进程标识和线程标识,获得所述程序行为对应的行为日志,包括:
基于所述机器标识、进程标识和线程标识,获得所述程序行为对应的调用标识符;
至少基于所述调用标识符,生成所述程序行为对应的行为日志。
3.根据权利要求2所述的方法,其特征在于,所述基于所述机器标识、进程标识和线程标识,获得所述程序行为对应的调用标识符,包括:
在机器集合中,获得与所述机器标识、所述进程标识和所述线程标识相关联的目标线程变量;
其中,所述机器集合中包括机器变量及所述机器变量对应的进程集合,所述进程集合中包括进程变量及所述进程变量对应的线程集合,所述线程集合中包括线程变量及所述线程变量对应的日志标识、当前调用层级和调用变量,所述调用变量之间按照其生成时对应的调用层级排序,所述调用变量表明在对应的调用层级上的调用次序;
获得所述目标线程变量中的日志标识作为所述程序行为的日志标识;
至少基于所述目标线程变量对应的调用变量,生成所述程序行为的层级标识;
至少基于所述日志标识和所述层级标识,生成所述程序行为对应的调用标识符。
4.根据权利要求3所述的方法,其特征在于,所述至少基于所述目标线程变量对应的调用变量,生成所述程序行为的层级标识,包括:
按照所述目标线程变量对应的调用变量之间的顺序,将所述调用变量通过连接符进行组合,以生成所述程序行为的层级标识。
5.根据权利要求1所述的方法,其特征在于,所述机器集合中的内容还通过以下方式处理:
在监测到程序行为结束的情况下,在所述机器标识和所述进程标识对应的线程集合中,将与所述线程标识对应的线程变量中的当前调用层级递减1;
若所述当前调用层级小于所述调用变量的数量,将所述当前调用层级对应的调用变量删除,用于下一个程序行为在当前调用层级上的调用变量的处理。
6.根据权利要求1所述的方法,其特征在于,所述方法还包括:
获得输出参数,所述输出参数包括机器参数、进程参数和线程参数中的任意一种或任意多种的组合;
获得所述输出参数对应的至少一个行为日志;
至少基于所述行为日志中的调用标识符,输出程序行为内容;
其中,所述程序行为内容包括至少一个调用程序标识,且所述调用程序标识在所述程序行为内容中的输出位置与所述调用程序标识对应的行为日志中的调用标识符相关联。
7.一种程序行为层级调用关系的记录装置,其特征在于,包括:
行为监测单元,用于监测程序行为;
参数获得单元,用于在所述行为监测单元监测到程序行为的情况下,获得所述程序行为对应的机器标识、进程标识和线程标识;
日志生成单元,用于至少基于所述程序行为对应的机器标识、进程标识和线程标识,获得所述程序行为对应的行为日志;其中,所述行为日志中包括调用标识符,所述调用标识符唯一表征所述程序行为的调用层级,所述调用标识符用于输出程序行为内容,所述程序行为内容包括至少一个调用程序标识,且所述调用程序标识在所述程序行为内容中的输出位置与所述调用程序标识对应的行为日志中的调用标识符相关联;
所述调用标识符是利用机器集合中的内容实现的,所述机器集合中的内容通过以下方式处理:
在监测到程序行为开始的情况下,在机器集合中,查找是否存在与所述机器标识相对应的机器变量;
若在所述机器集合中不存在与所述机器标识对应的机器变量,在所述机器集合中创建所述机器标识对应的机器变量及其对应的进程集合;
在所述机器集合中与所述机器标识对应的机器变量对应的进程集合中,查找是否存在与所述进程标识相对应的进程变量;
若在所述进程集合中不存在与所述进程标识对应的进程变量,在所述进程集合中创建所述进程标识对应的进程变量及其对应的线程集合;
在所述机器集合中与所述机器标识和所述进程标识对应的线程集合中,查找是否存在与所述线程标识相对应的线程变量;
若在所述机器标识和所述进程标识对应的线程集合中不存在与所述线程标识对应的线程变量,在所述线程集合中创建所述线程标识对应的线程变量并生成所述线程变量对应的日志标识,设置所述线程变量对应的当前调用层级递增1,所述当前调用层级在所述线程变量被创建时的初始值为0;
若在所述机器标识和所述进程标识对应的线程集合中存在与所述线程标识对应的线程变量且所述线程变量对应的当前调用层级为0,设置所述线程变量对应的当前调用层级递增1;
若在所述机器标识和所述进程标识对应的线程集合中存在与所述线程标识对应的线程变量且所述线程变量对应的当前调用层级非0,在所述线程集合中生成所述线程标识在所述当前调用层级上对应的调用变量,并设置所述线程变量对应的当前调用层级递增1,其中,生成的调用变量相对于上一个程序行为在当前调用层级上对应的调用变量递增1。
8.一种服务器,其特征在于,包括:
处理器和存储器;
其中,所述处理器用于执行所述存储器中存储的程序;
所述存储器用于存储程序,所述程序至少用于:
在监测到程序行为的情况下,获得所述程序行为对应的机器标识、进程标识和线程标识;
至少基于所述程序行为对应的机器标识、进程标识和线程标识,获得所述程序行为对应的行为日志;其中,所述行为日志中包括调用标识符,所述调用标识符唯一表征所述程序行为的调用层级,所述调用标识符用于输出程序行为内容,所述程序行为内容包括至少一个调用程序标识,且所述调用程序标识在所述程序行为内容中的输出位置与所述调用程序标识对应的行为日志中的调用标识符相关联;
所述调用标识符是利用机器集合中的内容实现的,所述机器集合中的内容通过以下方式处理:
在监测到程序行为开始的情况下,在机器集合中,查找是否存在与所述机器标识相对应的机器变量;
若在所述机器集合中不存在与所述机器标识对应的机器变量,在所述机器集合中创建所述机器标识对应的机器变量及其对应的进程集合;
在所述机器集合中与所述机器标识对应的机器变量对应的进程集合中,查找是否存在与所述进程标识相对应的进程变量;
若在所述进程集合中不存在与所述进程标识对应的进程变量,在所述进程集合中创建所述进程标识对应的进程变量及其对应的线程集合;
在所述机器集合中与所述机器标识和所述进程标识对应的线程集合中,查找是否存在与所述线程标识相对应的线程变量;
若在所述机器标识和所述进程标识对应的线程集合中不存在与所述线程标识对应的线程变量,在所述线程集合中创建所述线程标识对应的线程变量并生成所述线程变量对应的日志标识,设置所述线程变量对应的当前调用层级递增1,所述当前调用层级在所述线程变量被创建时的初始值为0;
若在所述机器标识和所述进程标识对应的线程集合中存在与所述线程标识对应的线程变量且所述线程变量对应的当前调用层级为0,设置所述线程变量对应的当前调用层级递增1;
若在所述机器标识和所述进程标识对应的线程集合中存在与所述线程标识对应的线程变量且所述线程变量对应的当前调用层级非0,在所述线程集合中生成所述线程标识在所述当前调用层级上对应的调用变量,并设置所述线程变量对应的当前调用层级递增1,其中,生成的调用变量相对于上一个程序行为在当前调用层级上对应的调用变量递增1。
9.一种存储介质,其特征在于,所述存储介质中存储有计算机可执行指令,所述计算机可执行指令被处理器加载并执行时,实现如上权利要求1至6任一项所述的程序行为层级调用关系的记录方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910900926.9A CN112540808B (zh) | 2019-09-23 | 2019-09-23 | 一种程序行为层级调用关系的记录方法及相关设备 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910900926.9A CN112540808B (zh) | 2019-09-23 | 2019-09-23 | 一种程序行为层级调用关系的记录方法及相关设备 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN112540808A CN112540808A (zh) | 2021-03-23 |
CN112540808B true CN112540808B (zh) | 2023-10-13 |
Family
ID=75013143
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910900926.9A Active CN112540808B (zh) | 2019-09-23 | 2019-09-23 | 一种程序行为层级调用关系的记录方法及相关设备 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112540808B (zh) |
Families Citing this family (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113419795B (zh) * | 2021-07-21 | 2022-05-03 | 网易(杭州)网络有限公司 | 调用关系的展示方法、装置、计算机设备及存储介质 |
CN114610689B (zh) * | 2022-03-17 | 2024-04-30 | 焦点科技股份有限公司 | 一种分布式环境中请求日志的记录和分析方法 |
CN116224400B (zh) * | 2023-03-03 | 2024-01-02 | 博泰车联网(南京)有限公司 | 一种定位分析方法、装置、设备及存储介质 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102902764A (zh) * | 2012-09-25 | 2013-01-30 | 北京奇虎科技有限公司 | 一种日志记录的方法和装置 |
CN103577310A (zh) * | 2012-07-20 | 2014-02-12 | 腾讯科技(深圳)有限公司 | 记录软件调试日志的方法以及装置 |
WO2014179635A1 (en) * | 2013-05-02 | 2014-11-06 | Microsoft Corporation | Activity based sampling of diagnostics data |
CN107645562A (zh) * | 2017-10-12 | 2018-01-30 | 广州爱九游信息技术有限公司 | 数据传输处理方法、装置、设备及系统 |
-
2019
- 2019-09-23 CN CN201910900926.9A patent/CN112540808B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103577310A (zh) * | 2012-07-20 | 2014-02-12 | 腾讯科技(深圳)有限公司 | 记录软件调试日志的方法以及装置 |
CN102902764A (zh) * | 2012-09-25 | 2013-01-30 | 北京奇虎科技有限公司 | 一种日志记录的方法和装置 |
WO2014179635A1 (en) * | 2013-05-02 | 2014-11-06 | Microsoft Corporation | Activity based sampling of diagnostics data |
CN107645562A (zh) * | 2017-10-12 | 2018-01-30 | 广州爱九游信息技术有限公司 | 数据传输处理方法、装置、设备及系统 |
Also Published As
Publication number | Publication date |
---|---|
CN112540808A (zh) | 2021-03-23 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US11494287B2 (en) | Scalable execution tracing for large program codebases | |
US10484506B2 (en) | Systems and processes for computer log analysis | |
CN111124906B (zh) | 基于动态埋点的跟踪方法、编译方法、装置和电子设备 | |
CN112540808B (zh) | 一种程序行为层级调用关系的记录方法及相关设备 | |
US11288245B2 (en) | Telemetry definition system | |
US11556456B2 (en) | Telemetry system extension | |
CN111290956B (zh) | 基于脑图的测试方法、装置、电子设备及存储介质 | |
US9588872B2 (en) | Discovery of code paths | |
US10509719B2 (en) | Automatic regression identification | |
US11436133B2 (en) | Comparable user interface object identifications | |
CN110263070A (zh) | 事件上报方法及装置 | |
CN111339118A (zh) | 基于Kubernetes的资源变更历史记录方法及装置 | |
CN112905441A (zh) | 测试用例生成方法、测试方法、装置及设备 | |
Cito et al. | Context-based analytics-establishing explicit links between runtime traces and source code | |
CN112506923A (zh) | 对应业务的方法调用链路确定方法、装置、电子设备 | |
CN109656825B (zh) | 美术资源处理的方法及装置、电子设备、存储介质 | |
CN113918373A (zh) | 一种内存泄露监控方法、内存泄露检测方法及相应装置 | |
CN113419738A (zh) | 接口文档的生成方法、装置及接口管理设备 | |
CN118503092A (zh) | 调用拓扑生成方法、装置、电子设备及可读存储介质 | |
CN115328801A (zh) | 数据库访问日志生成方法、装置、存储介质及计算机设备 | |
CN117033210A (zh) | 一种流量回放测试系统与方法 | |
CN115562945A (zh) | 链路信息的确定方法及装置、存储介质、电子设备 | |
CN117950976A (zh) | 数据处理方法、装置、电子设备、介质及程序产品 | |
CN116414687A (zh) | 应用程序编程接口的测试方法、装置及电子设备 | |
CN117389768A (zh) | 一种代码改动影响范围评估方法及装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
REG | Reference to a national code |
Ref country code: HK Ref legal event code: DE Ref document number: 40041054 Country of ref document: HK |
|
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |