Page 91 - 《软件学报》2021年第9期
P. 91
贾统 等:基于程序层次树的日志打印位置决策方法 2715
本文第 1 节介绍日志打印位置决策的相关研究工作.第 2 节对日志打印决策问题进行明确.第 3 节详细介
绍本文提出的日志打印位置决策方法.第 4 节给出相关实验,验证提出方法的效果.第 5 节总结本文的工作,并探
讨未来的研究工作.
1 相关工作
1.1 基于规则的日志打印位置决策
这类方法通常使用统计分析方法从成熟软件系统中总结日志打印规则,并使用这些规则构建日志打印位
[6]
置决策模型.Yuan 设计了一个 ErrLog 的工具,通过人工分析成熟软件系统的日志打印语句,总结日志打印的规
则,并利用这些规则决策新的日志打印位置.该工具的关键问题在于:其仅关注 Error 或 Warn 级别的日志打印位
[8]
置,并假设这些日志打印位置均位于异常处理程序中.Fu 等人 对微软的两个大规模分布式系统日志打印语句
进行了分析,总结出其中的若干日志打印策略,然后利用这些策略构建了一个日志打印决策模型.该方法的不足
在于:其仅对诸如异常处理,返回值校验等特殊的代码结构进行日志打印位置决策.
1.2 基于机器学习的日志打印位置决策
这类方法使用机器学习算法从成熟软件系统源码中学习日志打印语句周围的代码片段特征,进而构建日
[8]
志打印位置决策模型.微软的 Fu 等人 利用决策树模型构建了一个日志打印位置决策模型,基于该工作,Zhu 等
[4]
人 提出了一个日志打印位置决策工具 LogAdvisor,该工具通过提取系统源码的 3 种类别特征,构建了一个分类
模型以决策一段代码是否应该添加日志打印语句.上述两种方法和工具的不足在于,其仅能针对异常处理和返
回值校验的代码片段进行日志打印位置决策.另外,由于这两种方法提取的特征依赖于编程语言的语法支持,因
此难以拓展到其他语言编写的软件系统中.例如,LogAdvisor 提取的特征中包括 Throw 和 Empty CatchBlock 的
数量,但是在脚本语言中,通常少有这种类型的特征.Lal 等人 [14] 提出了 LogOptPlus 的日志打印位置决策方法,该
方法通过提取 18 个统计类型特征和 10 个文本类型特征,利用机器学习算法构建日志打印位置决策模型.该方
法的不足在于:其限制日志打印位置决策的区域为“if”和“catch”代码结构,难以拓展.
同基于规则的日志打印位置决策相比,基于机器学习的日志打印位置决策方法具备如下关键优势.
• 首先,日志打印的复杂性导致人工总结日志打印位置难以为继.日志打印决策需要考虑多方面因素,包
括故障诊断、性能记录、安全程度和对系统带来的额外负载等,因此难以对不同的软件系统人工总结
普适的日志打印策略;
• 基于机器学习的日志打印位置决策假设成熟软件系统中包含良好的日志打印规律,且这些规律能够
[8]
被机器学习算法捕获 ,从而将该问题转化为一个智能的有监督学习问题;
• 另外,机器学习模型能够伴随训练数据的不同而演化更新,而基于规则的日志打印位置决策方法的更
新优化依赖于人工,难以为继.
因此,本文同样基于机器学习算法构建日志打印位置决策模型,旨在提出一种普适的特征提取方法和模型
构建方法,突破现有工作中的诸多限制,如编程语言限制、代码结构限制等.另外,本文关注于跨组件、跨软件系
统的日志打印位置决策,而现有工作关注于软件系统内部的日志打印位置决策.
1.3 特定任务驱动的日志打印位置决策
这类工作通常利用程序分析及信息理论技术等从软件代码中搜索符合特定任务需求的日志打印位置.
Ding 等人 [15] 提出了一种日志过滤方法,该方法通过监控系统的性能,搜索对系统性能影响最大的日志打印位
置,然后过滤这些日志打印位置.Zhao 等人 [7,16] 利用程序分析技术,通过计算不同日志打印位置带来的信息熵增
益,找到能够区分最多程序路径的日志打印位置作为决策结果.我们之前的工作 [17] 设计了一种面向故障诊断的
日志打印位置决策方法,该方法利用信息增益算法从所有日志打印位置中搜索能够最大限度表征故障的日志
打印位置.这类方法同基于机器学习的日志打印位置决策方法是相辅相成的关系,同时,运用这两类方法能够有
效提升日志打印位置的质量,达到更加智能化的日志打印位置决策.