Page 98 - 《软件学报》2021年第9期
P. 98
2722 Journal of Software 软件学报 Vol.32, No.9, September 2021
着多数被分类为需要打印日志的代码块都是正确的,高召回率则意味着多数打印日志的代码块被正
确地分类.F1 反映了模型能够精确且全面地识别包含日志打印语句的代码块的性能,其计算公式如下:
F1=(2×Precision×Recall)/(Precision+Recall).
4.1.3 相关工作对比
日志打印位置决策任务的相关研究工作主要有 LogAdvisor 和 LogOptPlus,然而这些工作存在若干限制.表
1 列举了本文的方法同这些工作的对比.相关工作均针对特殊类型的代码块和特定的日志级别,同时对编程语
言有一定的限制,仅支持 C#,Java 等高级编程语言,无法支持 C 语言以及一些脚本语言.本文所述方法是一种针
对所有代码块的通用日志打印位置决策方法,在根本目的上与现有工作有较大区别.如果仅对比特定代码块的
日志打印决策效果对本文的方法不公平,如果对比所有代码块的日志打印决策效果则对相关工作不公平,因此
实验中没有同相关工作进行决策效果对比.实验选取了 LogAdvisor 中所对比的方法——随机添加日志打印语
句(random error logging)作为基线,并随机测试 5 次取平均以减少实验结果的偏差.
Table 1 Comparison on related works
表 1 相关工作对比
相关工作 代码块限制 日志级别限制 编程语言限制
[4]
LogAdvisor exception & return-value-check blocks ERROR & WARN C#,Java 等高级编程语言
LogOptPlus [14] if & catch blocks NONE Java
FineLog 无 无 无
4.2 多场景下评估日志打印位置决策
在这个实验中,我们首先定义了 3 个场景,包括版本升级、组件开发和系统开发.根据编程语言的不同,5 个
软件系统被分为两组:Python 组和 Java 组,分别在两组实验系统上测试 3 种场景下日志打印位置决策模型的效
率.如表 2 所示:在版本升级场景中,选择软件系统的旧版本代码作为训练集,新版本的代码选作测试集,验证和
评估所提出的方法在跨版本日志打印位置决策中的效率;在组件开发场景中,选择一个组件的代码作为训练集,
同一系统的另一个组件的代码作为测试集,验证和评估所提出的方法在跨组件日志打印位置决策中的效率;在
系统开发场景中,选择一个系统的代码进行训练,另一个系统的代码进行测试,验证和评估所提出的方法在跨系
统日志打印决策中的效率.
Table 2 Design of multiple scenario experiment
表 2 多场景评估实验设计
测试
训练 版本升级(跨版本决策) 组件开发(跨组件决策) 系统开发(跨系统决策)
Yarn-3.0.0 Hdfs-3.0.0 Angel
Java
Yarn-2.6.5 Yarn-3.0.0 Apache Hadoop
Nova-16.0.3 Nova-16.0.3 TensorFlow
Python SaltCloud
Nova-14.0.10 Nova-16.0.3 OpenStack
实验结果如图 6 所示.
• 在版本升级场景下评估跨版本的日志打印位置决策模型(如图 6(a)所示),Python 组实现了 0.692 的准确
率和 0.525 的 F1 指标;同时,Java 组达到了 0.965 的准确率和 0.890 的 F1;
• 在组件开发场景下评估跨组件的日志打印位置决策模型(如图 6(b)所示),Python 组实验得到了 0.659
的准确率和 0.690 的 F1,Java 组实验中达到了 0.960 的准确率和 0.866 的 F1;
• 在系统开发场景下评估跨系统的日志打印位置决策模型(如图 6(c)所示),Python 组的实验以
TensorFlow 为测试集时达到 0.663 的准确率和 0.529 的 F1,使用 SaltCloud 作为测试集时准确率达到
0.773,F1 达到 0.565;在 Java 组实验中达到 0.969 的准确率和 0.925 的 F1.同基线(RandomErrorLogging)
相比,Python 组提升了近 20%的准确率,Java 组则提升了 40%以上的准确率.