Page 90 - 《软件学报》2021年第9期
P. 90

2714                                 Journal of Software  软件学报 Vol.32, No.9,  September 2021

         Key words:    logging decision; program layered structure tree; transfer learning

                                                                    [1]
             随着人工智能技术的发展,Gartner 提出智能运维(AIOps)技术的概念 ,即:通过机器学习等算法分析从多
                                                                                       [2]
         种运维工具和设备收集而来的大规模数据,自动发现并实时响应,以增强 IT 运维能力和自动化程度 .在 AIOps
         技术趋势下,基于系统日志的大规模分布式系统自动化故障诊断技术发展迅速.这些技术通过分析和挖掘系统
         日志,构建刻画系统正常运行时的请求执行路径的模型,然后自动检测系统运行时的日志序列与模型之间的偏
                                      .
         差,以实现精确异常检测和故障诊断 然而,这种基于日志的自动化故障诊断技术存在一个重要的瓶颈,即系统日
                                                                           [3]
         志的质量.对大规模软件如 Apache,Squid,PostgreSQL 等的系统失效报告分析发现 ,77%的系统失效归结于几
         种常见错误模式,而这些错误模式中有超过一半(57%)并没有被记录在系统日志中,导致自动化故障诊断模型
         无从分析与检测,从而需要花费大量人工和时间成本来定位、诊断和修复这些错误.
             现今,软件系统开发缺乏统一的日志打印标准和规范,其日志打印决策依赖于程序开发人员的个人理解和
         调试需求.由于软件开发人员的编程风格、领域知识和需求的不同,程序中日志打印的风格、内容、位置也大
         相径庭,由此引发分布式系统日志质量的参差不齐.有调研表明:即使是在国际领先的软件企业,也很难找到明
         确的高质量日志打印规范或指导;即使采用专业的日志打印框架如 Log4j,Self4j 等,程序开发人员仍需根据相对
                                     [4]
         片面的领域知识进行日志打印决策 .由于大规模分布式软件系统代码量巨大,且结构复杂,人工在系统中添加
         或修改日志几乎是不可能的.因此,实现日志的自动化打印决策并提高日志质量的需求越来越迫切.
                                     [5]
             高质量的日志应具备 3 个特征 .
             (1)  日志打印的位置合理,即系统运行时产生的日志能够反映系统运行时状态的变化;
             (2)  日志中包含的信息丰富,即日志的文本信息能够帮助系统管理人员理解系统的运行行为;
             (3)  日志打印的数量适当.过多的日志会增加系统运行时开销,同时冗余和无用的日志不利于从日志中搜
                 索和辨识故障信息.
             本文关注日志打印位置决策问题,为解决该问题,有研究人员提出通过代码分析的方法得到若干日志打印
                   [6]
                                 [7]
         位置的规则 或日志打印位置 ;也有研究人员提出机器学习的方法,通过学习日志打印位置附近的代码特征,
                                [4]
         构建日志打印位置决策模型 .然而,相关研究工作中存在两个重要问题:(1)  特征提取方法受限于特定编程语
         言,且日志打印位置决策的区域有限制,例如仅能够对 Exception 模块的日志打印位置进行决策;(2)  现有工作的
         日志打印位置决策模型无法有效处理不同软件系统在特征空间上的差异,很难实现跨软件系统的日志打印位
         置决策.因此,如何为由不同编程语言实现的不同软件系统实现自动化与智能化的日志打印位置决策并提高日
         志质量,仍然是一个亟待解决的难题.
                                                                            [8]
             针对该问题,考虑到已多次更新升级的成熟软件往往具有良好的日志打印策略 ,本文提出一种基于程序
         层次树与迁移学习的日志打印位置决策方法,通过有效迁移成熟软件系统的日志打印知识,来为目标系统决策
         日志打印位置.具体的,以代码块为单位切分软件系统代码,构建程序层次树提取代码块子向量,并采用子树上
         提和逆序组合的方式提取代码块的结构特征和上下文特征,以生成代码块特征向量;采用迁移学习的方法构建
         成熟软件系统与待决策的目标软件系统日志打印程序的共同特征空间,使用机器学习模型学习特征空间中的
         特征向量分布,以实现跨软件系统的日志打印位置的决策.本文的创新之处在于:(1)  提出一种通用的代码特征
         向量自动化提取方法,通过构建程序层次树,屏蔽编程语言与程序模块实现细节的异构性,以支持不同编程语言
         编写的软件系统;(2)  提出一种基于迁移学习的日志打印位置决策模型,利用迁移成分分析算法(transfer
         component analysis,简称 TCA)和联合分配适配算法(JointDistribution adaptation,简称 JDA)将不同系统特征向量
         的特征向量映射到新的公共特征空间,进而削减特征差异,以支持跨软件系统的日志打印位置决策.
                                                                       [9]
             在 由两种 编程 语言实 现的 5 个 成熟的 软件系统 Apache Hadoop ,TencentAngel              [10] ,OpenStack [11] ,
         SaltCloud [12] 和 Tensorflow [13] 的实验表明,本文所提出的方法在跨组件、跨相同编程语言的不同软件系统的日志
         打印位置决策均具有良好的效果.例如,在以 Hadoop 的代码作为训练集决策 Tencent Angle 的日志打印位置实验
         中,本方法达到了 0.969 的准确率和 0.925 的 F1.
   85   86   87   88   89   90   91   92   93   94   95