賈 統(tǒng),李 影,張齊勛,吳中海,
1(北京大學(xué) 信息科學(xué)技術(shù)學(xué)院,北京 10087 1)
2(北京大學(xué) 軟件工程國家工程研究中心,北京 10 0871)
3(北京大學(xué) 軟件與微電子學(xué)院,北京 10260 0)
隨著人工智能技術(shù)的發(fā)展,Gartner 提出智能運(yùn)維(AIOps)技術(shù)的概念[1],即:通過機(jī)器學(xué)習(xí)等算法分析從多種運(yùn)維工具和設(shè)備收集而來的大規(guī)模數(shù)據(jù),自動發(fā)現(xiàn)并實(shí)時響應(yīng),以增強(qiáng)IT 運(yùn)維能力和自動化程度[2].在AIOps技術(shù)趨勢下,基于系統(tǒng)日志的大規(guī)模分布式系統(tǒng)自動化故障診斷技術(shù)發(fā)展迅速.這些技術(shù)通過分析和挖掘系統(tǒng)日志,構(gòu)建刻畫系統(tǒng)正常運(yùn)行時的請求執(zhí)行路徑的模型,然后自動檢測系統(tǒng)運(yùn)行時的日志序列與模型之間的偏差,以實(shí)現(xiàn)精確異常檢測和故障診斷.然而,這種基于日志的自動化故障診斷技術(shù)存在一個重要的瓶頸,即系統(tǒng)日志的質(zhì)量.對大規(guī)模軟件如Apache,Squid,PostgreSQL 等的系統(tǒng)失效報告分析發(fā)現(xiàn)[3],77%的系統(tǒng)失效歸結(jié)于幾種常見錯誤模式,而這些錯誤模式中有超過一半(57%)并沒有被記錄在系統(tǒng)日志中,導(dǎo)致自動化故障診斷模型無從分析與檢測,從而需要花費(fèi)大量人工和時間成本來定位、診斷和修復(fù)這些錯誤.
現(xiàn)今,軟件系統(tǒng)開發(fā)缺乏統(tǒng)一的日志打印標(biāo)準(zhǔn)和規(guī)范,其日志打印決策依賴于程序開發(fā)人員的個人理解和調(diào)試需求.由于軟件開發(fā)人員的編程風(fēng)格、領(lǐng)域知識和需求的不同,程序中日志打印的風(fēng)格、內(nèi)容、位置也大相徑庭,由此引發(fā)分布式系統(tǒng)日志質(zhì)量的參差不齊.有調(diào)研表明:即使是在國際領(lǐng)先的軟件企業(yè),也很難找到明確的高質(zhì)量日志打印規(guī)范或指導(dǎo);即使采用專業(yè)的日志打印框架如Log4j,Self4j 等,程序開發(fā)人員仍需根據(jù)相對片面的領(lǐng)域知識進(jìn)行日志打印決策[4].由于大規(guī)模分布式軟件系統(tǒng)代碼量巨大,且結(jié)構(gòu)復(fù)雜,人工在系統(tǒng)中添加或修改日志幾乎是不可能的.因此,實(shí)現(xiàn)日志的自動化打印決策并提高日志質(zhì)量的需求越來越迫切.
高質(zhì)量的日志應(yīng)具備3 個特征[5].
(1)日志打印的位置合理,即系統(tǒng)運(yùn)行時產(chǎn)生的日志能夠反映系統(tǒng)運(yùn)行時狀態(tài)的變化;
(2)日志中包含的信息豐富,即日志的文本信息能夠幫助系統(tǒng)管理人員理解系統(tǒng)的運(yùn)行行為;
(3)日志打印的數(shù)量適當(dāng).過多的日志會增加系統(tǒng)運(yùn)行時開銷,同時冗余和無用的日志不利于從日志中搜索和辨識故障信息.
本文關(guān)注日志打印位置決策問題,為解決該問題,有研究人員提出通過代碼分析的方法得到若干日志打印位置的規(guī)則[6]或日志打印位置[7];也有研究人員提出機(jī)器學(xué)習(xí)的方法,通過學(xué)習(xí)日志打印位置附近的代碼特征,構(gòu)建日志打印位置決策模型[4].然而,相關(guān)研究工作中存在兩個重要問題:(1)特征提取方法受限于特定編程語言,且日志打印位置決策的區(qū)域有限制,例如僅能夠?qū)xception 模塊的日志打印位置進(jìn)行決策;(2)現(xiàn)有工作的日志打印位置決策模型無法有效處理不同軟件系統(tǒng)在特征空間上的差異,很難實(shí)現(xiàn)跨軟件系統(tǒng)的日志打印位置決策.因此,如何為由不同編程語言實(shí)現(xiàn)的不同軟件系統(tǒng)實(shí)現(xiàn)自動化與智能化的日志打印位置決策并提高日志質(zhì)量,仍然是一個亟待解決的難題.
針對該問題,考慮到已多次更新升級的成熟軟件往往具有良好的日志打印策略[8],本文提出一種基于程序?qū)哟螛渑c遷移學(xué)習(xí)的日志打印位置決策方法,通過有效遷移成熟軟件系統(tǒng)的日志打印知識,來為目標(biāo)系統(tǒng)決策日志打印位置.具體的,以代碼塊為單位切分軟件系統(tǒng)代碼,構(gòu)建程序?qū)哟螛涮崛〈a塊子向量,并采用子樹上提和逆序組合的方式提取代碼塊的結(jié)構(gòu)特征和上下文特征,以生成代碼塊特征向量;采用遷移學(xué)習(xí)的方法構(gòu)建成熟軟件系統(tǒng)與待決策的目標(biāo)軟件系統(tǒng)日志打印程序的共同特征空間,使用機(jī)器學(xué)習(xí)模型學(xué)習(xí)特征空間中的特征向量分布,以實(shí)現(xiàn)跨軟件系統(tǒng)的日志打印位置的決策.本文的創(chuàng)新之處在于:(1)提出一種通用的代碼特征向量自動化提取方法,通過構(gòu)建程序?qū)哟螛?屏蔽編程語言與程序模塊實(shí)現(xiàn)細(xì)節(jié)的異構(gòu)性,以支持不同編程語言編寫的軟件系統(tǒng);(2)提出一種基于遷移學(xué)習(xí)的日志打印位置決策模型,利用遷移成分分析算法(transfer component analysis,簡稱TCA)和聯(lián)合分配適配算法(JointDistribution adaptation,簡稱JDA)將不同系統(tǒng)特征向量的特征向量映射到新的公共特征空間,進(jìn)而削減特征差異,以支持跨軟件系統(tǒng)的日志打印位置決策.
在由兩種編程語言實(shí)現(xiàn)的 5 個成熟的軟件系統(tǒng) Apache Ha doop[9],TencentAngel[10],OpenStack[11],SaltCloud[12]和Tensorflow[13]的實(shí)驗表明,本文所提出的方法在跨組件、跨相同編程語言的不同軟件系統(tǒng)的日志打印位置決策均具有良好的效果.例如,在以Hadoop 的代碼作為訓(xùn)練集決策Tencent Angle的日志打印位置實(shí)驗中,本方法達(dá)到了0.969 的準(zhǔn)確率和0.925 的F1.
本文第1 節(jié)介紹日志打印位置決策的相關(guān)研究工作.第2 節(jié)對日志打印決策問題進(jìn)行明確.第3 節(jié)詳細(xì)介紹本文提出的日志打印位置決策方法.第4 節(jié)給出相關(guān)實(shí)驗,驗證提出方法的效果.第5 節(jié)總結(jié)本文的工作,并探討未來的研究工作.
這類方法通常使用統(tǒng)計分析方法從成熟軟件系統(tǒng)中總結(jié)日志打印規(guī)則,并使用這些規(guī)則構(gòu)建日志打印位置決策模型.Yuan[6]設(shè)計了一個ErrLog 的工具,通過人工分析成熟軟件系統(tǒng)的日志打印語句,總結(jié)日志打印的規(guī)則,并利用這些規(guī)則決策新的日志打印位置.該工具的關(guān)鍵問題在于:其僅關(guān)注Error 或Warn 級別的日志打印位置,并假設(shè)這些日志打印位置均位于異常處理程序中.Fu 等人[8]對微軟的兩個大規(guī)模分布式系統(tǒng)日志打印語句進(jìn)行了分析,總結(jié)出其中的若干日志打印策略,然后利用這些策略構(gòu)建了一個日志打印決策模型.該方法的不足在于:其僅對諸如異常處理,返回值校驗等特殊的代碼結(jié)構(gòu)進(jìn)行日志打印位置決策.
這類方法使用機(jī)器學(xué)習(xí)算法從成熟軟件系統(tǒng)源碼中學(xué)習(xí)日志打印語句周圍的代碼片段特征,進(jìn)而構(gòu)建日志打印位置決策模型.微軟的Fu 等人[8]利用決策樹模型構(gòu)建了一個日志打印位置決策模型,基于該工作,Zhu 等人[4]提出了一個日志打印位置決策工具LogAdvisor,該工具通過提取系統(tǒng)源碼的3 種類別特征,構(gòu)建了一個分類模型以決策一段代碼是否應(yīng)該添加日志打印語句.上述兩種方法和工具的不足在于,其僅能針對異常處理和返回值校驗的代碼片段進(jìn)行日志打印位置決策.另外,由于這兩種方法提取的特征依賴于編程語言的語法支持,因此難以拓展到其他語言編寫的軟件系統(tǒng)中.例如,LogAdvisor 提取的特征中包括Throw 和Empty CatchBlock 的數(shù)量,但是在腳本語言中,通常少有這種類型的特征.Lal 等人[14]提出了LogOptPlus 的日志打印位置決策方法,該方法通過提取18 個統(tǒng)計類型特征和10 個文本類型特征,利用機(jī)器學(xué)習(xí)算法構(gòu)建日志打印位置決策模型.該方法的不足在于:其限制日志打印位置決策的區(qū)域為“if”和“catch”代碼結(jié)構(gòu),難以拓展.
同基于規(guī)則的日志打印位置決策相比,基于機(jī)器學(xué)習(xí)的日志打印位置決策方法具備如下關(guān)鍵優(yōu)勢.
?首先,日志打印的復(fù)雜性導(dǎo)致人工總結(jié)日志打印位置難以為繼.日志打印決策需要考慮多方面因素,包括故障診斷、性能記錄、安全程度和對系統(tǒng)帶來的額外負(fù)載等,因此難以對不同的軟件系統(tǒng)人工總結(jié)普適的日志打印策略;
?基于機(jī)器學(xué)習(xí)的日志打印位置決策假設(shè)成熟軟件系統(tǒng)中包含良好的日志打印規(guī)律,且這些規(guī)律能夠被機(jī)器學(xué)習(xí)算法捕獲[8],從而將該問題轉(zhuǎn)化為一個智能的有監(jiān)督學(xué)習(xí)問題;
?另外,機(jī)器學(xué)習(xí)模型能夠伴隨訓(xùn)練數(shù)據(jù)的不同而演化更新,而基于規(guī)則的日志打印位置決策方法的更新優(yōu)化依賴于人工,難以為繼.
因此,本文同樣基于機(jī)器學(xué)習(xí)算法構(gòu)建日志打印位置決策模型,旨在提出一種普適的特征提取方法和模型構(gòu)建方法,突破現(xiàn)有工作中的諸多限制,如編程語言限制、代碼結(jié)構(gòu)限制等.另外,本文關(guān)注于跨組件、跨軟件系統(tǒng)的日志打印位置決策,而現(xiàn)有工作關(guān)注于軟件系統(tǒng)內(nèi)部的日志打印位置決策.
這類工作通常利用程序分析及信息理論技術(shù)等從軟件代碼中搜索符合特定任務(wù)需求的日志打印位置.Ding 等人[15]提出了一種日志過濾方法,該方法通過監(jiān)控系統(tǒng)的性能,搜索對系統(tǒng)性能影響最大的日志打印位置,然后過濾這些日志打印位置.Zhao 等人[7,16]利用程序分析技術(shù),通過計算不同日志打印位置帶來的信息熵增益,找到能夠區(qū)分最多程序路徑的日志打印位置作為決策結(jié)果.我們之前的工作[17]設(shè)計了一種面向故障診斷的日志打印位置決策方法,該方法利用信息增益算法從所有日志打印位置中搜索能夠最大限度表征故障的日志打印位置.這類方法同基于機(jī)器學(xué)習(xí)的日志打印位置決策方法是相輔相成的關(guān)系,同時,運(yùn)用這兩類方法能夠有效提升日志打印位置的質(zhì)量,達(dá)到更加智能化的日志打印位置決策.
日志打印位置決策的目的是從系統(tǒng)源碼中選擇需要添加日志打印語句的位置(代碼行),但是現(xiàn)有的軟件系統(tǒng)規(guī)模極其龐大,代碼量巨大,導(dǎo)致需要添加日志打印語句的位置占所有日志代碼行的比例小于1%,這會導(dǎo)致訓(xùn)練數(shù)據(jù)極度不平衡,難以構(gòu)建機(jī)器學(xué)習(xí)模型.為解決該問題,本文首先定義了代碼塊(CodeBlock)的概念,并使用代碼塊作為日志打印位置決策的基本單位,即,將該問題轉(zhuǎn)化為對代碼塊中是否添加日志打印語句進(jìn)行決策.
代碼塊是一段不包含任何層次或嵌套結(jié)構(gòu)的代碼片段.代碼塊的提取可以通過兩種標(biāo)識符切割,包括分支或循環(huán)的起點(diǎn)和分支或循環(huán)的終點(diǎn).以圖1 為例,該圖截取了Hadoop-YARN 項目中RMAppManager.java 文件中的一個函數(shù),通過“{”和“}”對該函數(shù)進(jìn)行切分,共獲取了5 個代碼塊.本質(zhì)上講,代碼塊是一段順序執(zhí)行的代碼行的集合,以代碼塊為基本決策單位,能夠有效降低日志打印位置決策問題的復(fù)雜性,大大降低訓(xùn)練數(shù)據(jù)的不均衡程度.通常而言,一個代碼塊內(nèi)部的日志打印語句通常表征該代碼塊的功能或執(zhí)行結(jié)果,因此大多數(shù)情況下,一個代碼塊中通常只包含一個日志打印語句,且這個日志打印語句的具體位置不重要.經(jīng)過對hadoop 2.8.1 源代碼的統(tǒng)計分析發(fā)現(xiàn):在包含日志打印語句的所有代碼塊中,有12 812 個代碼塊僅包含一條日志打印語句(占比95.1%),658 個代碼塊包含多于一條日志打印語句(占比4.9%).以圖1 中代碼塊1 的日志打印語句為例,不論該語句位于代碼塊1 中的哪一行,該日志打印語句所表達(dá)的信息不受影響.另外,代碼塊作為一個抽象的概念,具備較強(qiáng)的通用性,能夠適配不同的程序開發(fā)語言編寫的軟件系統(tǒng).代碼塊不同于程序基本塊(BasicBlock):基本塊的劃分以程序功能為依據(jù),包括一個單一入口和出口;代碼塊則是以程序結(jié)構(gòu)為劃分依據(jù),其粒度小于基本塊.經(jīng)過對hadoop 2.8.1 源代碼中所有代碼塊包含的代碼行數(shù)進(jìn)行統(tǒng)計,結(jié)果表明,平均每個代碼塊包含4.443 行代碼.因此,對于日志打印位置決策任務(wù)而言,以代碼塊為粒度決策日志打印位置,能夠有效地輔助程序開發(fā)人員打印日志.
Fig.1 Example of program and code block圖1 程序片段與代碼塊示例
以代碼塊為基礎(chǔ),這里明確本文的研究目標(biāo).
令某代碼塊為cbi∈{cbx|0≤x≤p},其中,p代表所有代碼塊的數(shù)量.本文旨在構(gòu)建一個日志打印位置決策模型F(~),預(yù)測代碼塊cbi的標(biāo)簽類型為logged 或unlogged,形式化如下:
labeli=F(cbi).
其中,labeli∈{logged,unlogged}.
圖2 給出了本文所述方法的整體流程和框架.
Fig.2 Workflow of our approach圖2 方法流程
本方法包括實(shí)例收集、標(biāo)簽標(biāo)識、特征向量生成、模型構(gòu)建和日志打印決策這5 個關(guān)鍵步驟.實(shí)例收集以代碼塊為單位切分源代碼;標(biāo)簽標(biāo)識即從代碼塊中搜索日志打印語句,方法為關(guān)鍵詞搜索,如LOG,logging,logger等.通過實(shí)例收集和標(biāo)簽標(biāo)識,初步得到模型訓(xùn)練數(shù)據(jù)實(shí)例為
instancei=(cbi,labeli).
如果cbi包含日志打印語句,則labeli取值為logged;反之,取值為unlogged.特征向量生成步驟通過神經(jīng)語言模型為每個代碼塊生成一個特征向量,稱為子向量,然后組合一段程序中的代碼塊子向量,最終生成完整的特征向量.第3.1 節(jié)會詳細(xì)介紹特征生成步驟的方法.模型構(gòu)建步驟首先通過遷移學(xué)習(xí)算法屏蔽不同組件或不同軟件系統(tǒng)代碼特征空間之間的差異,然后使用機(jī)器學(xué)習(xí)算法構(gòu)建分類模型.第3.2 節(jié)詳細(xì)介紹模型構(gòu)建方法.日志打印決策步驟利用已訓(xùn)練的分類模型對新的軟件或新的組件中的代碼塊進(jìn)行日志打印決策.
特征向量生成首先利用神經(jīng)網(wǎng)絡(luò)語言模型從每個代碼塊中提取特征向量(下文稱為子向量),以提取代碼片段的文本特征;然后,針對每個代碼塊,組合與其位于相同函數(shù)中的其他代碼塊的子向量以生成完整的特征向量,以提取代碼片段的上下文和結(jié)構(gòu)特征.本文提出的特征向量生成方法具有3 個特點(diǎn).
(1)通用性,適用于不同的編程語言;
(2)全覆蓋性,能夠針對所有的代碼塊生成特征向量,對代碼塊或代碼片段無假設(shè);
(3)自動化.與傳統(tǒng)特征工程不同,該特征生成方法無需任何人工定義或指導(dǎo).
下面詳細(xì)介紹這兩個步驟.
3.1.1 基于神經(jīng)網(wǎng)絡(luò)語言模型生成代碼塊子向量
為了提取代碼文本特征,需要為每個代碼塊生成固定長度的特征向量(即子向量):首先,按照空格和符號切分每個代碼塊,將其轉(zhuǎn)換成單詞列表;然后使用神經(jīng)網(wǎng)絡(luò)語言模型PV-DM 學(xué)習(xí)單詞列表,訓(xùn)練模型對其生成向量表示.PV-DM 模型由輸入層、投影層、隱藏層和輸出層組成:在輸入層,使用1-V 編碼對段落中的段落ID 和前N個詞語進(jìn)行編碼,其中,N是用戶定義的參數(shù),V是詞匯表的大小;然后,使用共享投影矩陣將輸入層投影到具有維度(N+1)×D的投影層P;輸出層則是經(jīng)典的SoftMax 分類器.訓(xùn)練過程中,使用隨機(jī)梯度下降法來訓(xùn)練段向量和字向量,并且通過反向傳播來更新梯度.最后,使用訓(xùn)練過的D維向量作為每個代碼塊對應(yīng)的子向量.
3.1.2 基于程序?qū)哟螛淠嫦蚪M合代碼塊子向量
一個代碼塊中是否打印日志,不僅受代碼塊本身內(nèi)容的影響,還受到其相鄰代碼塊的影響.例如,圖1 中的Codeblock5 中僅包含日志打印語句,而其相鄰的代碼塊則描述了程序邏輯,為該日志打印語句提供了豐富的上下文信息.此外,分支、循環(huán)等復(fù)雜的程序結(jié)構(gòu)也對日志決策產(chǎn)生重要影響.直觀地說,開發(fā)人員更可能在這些復(fù)雜的代碼結(jié)構(gòu)中添加日志打印語句,以幫助理解程序邏輯和行為.因此,有必要組合相鄰代碼塊的子向量以捕獲代碼塊的上下文特征和結(jié)構(gòu)特征.
受AST 的啟發(fā),本節(jié)提出了一種代碼語法結(jié)構(gòu)的粗粒度表示方法——程序?qū)哟螛?program lay ered syntax tree,簡稱PLST)作為組合子向量的基礎(chǔ).與AST 中每個節(jié)點(diǎn)表示變量、關(guān)鍵字或運(yùn)算符等細(xì)粒度結(jié)構(gòu)相比,PLST 中的節(jié)點(diǎn)表示代碼塊,能夠有效降低復(fù)雜性并提高特征提取的效率.令待生成特征向量的代碼塊為目標(biāo)代碼塊,則在PLST 基礎(chǔ)上如何提取目標(biāo)代碼塊的附近的代碼特征,即如何組合目標(biāo)代碼塊附近的代碼塊子向量是一個難題.原因在于:
?第一,影響日志打印位置的程序范圍很難確定.從編程習(xí)慣的角度來看,日志打印語句被用來記錄剛剛發(fā)生的某個事件或行為,因此對于目標(biāo)代碼塊而言,最影響日志打印決策的程序片段應(yīng)該是該代碼塊之前的程序片段;另外,代碼塊的日志打印決策也受到程序功能和代碼邏輯的影響,而函數(shù)是程序中最小的功能邏輯單元,因此本方法將函數(shù)內(nèi)目標(biāo)代碼塊及其之前的代碼塊子向量進(jìn)行組合,從而完整地表示目標(biāo)代碼塊;
?第二,鄰近代碼塊的上下文信息極其相似,會極大地混淆日志打印決策模型.兩個鄰近代碼塊周圍的程序文本非常相似,甚至大部分程序文本是相同的,但其數(shù)據(jù)標(biāo)簽卻很有可能是完全不同的.這將極大地混淆決策模型,降低決策效果.針對該問題,本節(jié)提出一種逆序組合的方法,采用相對位置代替絕對位置,組合目標(biāo)代碼塊前的代碼塊子向量,從而生成目標(biāo)代碼塊的特征向量.
每棵PLST 代表一個函數(shù),根表示函數(shù)名稱,節(jié)點(diǎn)表示代碼塊.每一個代碼塊所處的層由其位于程序中的嵌套層次決定,同一層中的代碼塊嚴(yán)格遵循其在代碼中的先后順序排布.每個PLST 通過深度優(yōu)先遍歷可以恢復(fù)成原程序代碼.為獲取PLST,不同編程語言的代碼塊由于語法不同而需要少量適應(yīng)性處理.例如,Java 中的分層標(biāo)識為“{”,Python 中則為4 個空格.圖3 展示了程序結(jié)構(gòu)和功能完全相同而編程語言不同的兩段代碼,這兩段代碼可以被轉(zhuǎn)換成同一棵PLST.
Fig.3 Example of PLST of different programming languages圖3 不同編程語言代碼的相同程序?qū)哟螛浔硎?/p>
接下來,利用每個代碼塊的子向量及其所屬的PLST,提出一種逆序組合的方法為每個代碼塊生成完整的特征向量.令每個代碼塊的子向量長度為l,逆序組合方法首先遍歷目標(biāo)代碼塊的左兄弟節(jié)點(diǎn),以目標(biāo)代碼塊起始,逆序組合其所有左兄弟節(jié)點(diǎn)的子向量,設(shè)置一個節(jié)點(diǎn)上限m:如果逆序組合的節(jié)點(diǎn)數(shù)量超過節(jié)點(diǎn)上限m,則刪除超過部分的子向量;如果不足m,以零向量補(bǔ)齊.組合完畢的向量被稱為層向量,其長度為l×m.然后,以相同的方法處理目標(biāo)代碼塊的父節(jié)點(diǎn),即逆序組合目標(biāo)代碼塊的父節(jié)點(diǎn)的左兄弟節(jié)點(diǎn),直到節(jié)點(diǎn)上限m,得到目標(biāo)代碼塊父節(jié)點(diǎn)的層向量.然后,將該層向量排布在目標(biāo)節(jié)點(diǎn)的層向量之后,設(shè)置一個層數(shù)上限n.以此類推,組合每層向量直到層數(shù)達(dá)到上限n.如果從目標(biāo)代碼塊到PLST 的根節(jié)點(diǎn)的總層數(shù)小于n,則以零向量補(bǔ)齊至完整特征向量長度達(dá)到l×m×n.
基于逆序組合的特征向量生成方法的細(xì)節(jié)如算法1 所述,輸入是程序?qū)哟螛浜痛商卣飨蛄康哪繕?biāo)代碼塊,輸出是目標(biāo)代碼塊的特征向量.算法從目標(biāo)代碼塊在程序?qū)哟螛渲械膶悠鹗?由下至上遍歷,直到根節(jié)點(diǎn)或達(dá)到層數(shù)上限n(第2 行).對于每一層,以臨時目標(biāo)節(jié)點(diǎn)(temp_tb)為起始依次遍歷其左兄弟節(jié)點(diǎn),臨時目標(biāo)節(jié)點(diǎn)被定義為目標(biāo)節(jié)點(diǎn)及其祖先節(jié)點(diǎn),上層的臨時目標(biāo)節(jié)點(diǎn)為下層臨時目標(biāo)節(jié)點(diǎn)的父親節(jié)點(diǎn).依照遍歷順序依次排列臨時目標(biāo)節(jié)點(diǎn)和其左兄弟節(jié)點(diǎn),直到達(dá)到節(jié)點(diǎn)上限m(第5 行~第10 行).
在逆序組合的過程中,當(dāng)某節(jié)點(diǎn)存在孩子節(jié)點(diǎn)時,如果僅組合該節(jié)點(diǎn)對應(yīng)的子向量是不合理的.原因在于:從代碼角度看,其孩子節(jié)點(diǎn)也同樣位于目標(biāo)代碼塊之前,因此會對目標(biāo)代碼塊的日志打印決策產(chǎn)生影響.為解決該問題,提出了一種子樹上提的方法來捕獲這些孩子節(jié)點(diǎn)的特征.如算法2所示:子樹上提利用深度優(yōu)先遍歷算法,搜索某節(jié)點(diǎn)的所有子孫節(jié)點(diǎn)(第2 行),然后將這些代碼塊依次遍歷順序排列組合成新的代碼片段(第3 行、第4 行),最后將該代碼片段輸入已訓(xùn)練的神經(jīng)語言模型生成新的子向量(第5 行).在逆序組合過程中,使用該新的子向量替代原子向量.
算法1.基于逆序組合的特征向量生成算法.
算法2.子樹上提算法.
圖4 是子向量逆序組合過程的一個例子,其中,N8是目標(biāo)代碼塊.
Fig.4 Example of reverse composition圖4 子向量逆序組合示例
本方法首先逆序組合生成第4 層到第1 層的層向量.由于N8是第4 層中唯一的代碼塊,排列N8對應(yīng)的子向量v8并用零填充的其余部分作為第4 層目標(biāo)代碼塊的層向量.對于第3 層,依次組合N8的父節(jié)點(diǎn)N6對應(yīng)的子向量v6以及N6的左兄弟節(jié)點(diǎn)N5的子向量v5.在第2 層,由于N2有一個子節(jié)點(diǎn)N4,因此利用子樹上提方法將其轉(zhuǎn)換為新節(jié)點(diǎn)N10,并依次組成v3和v10.然后,將從第4 層到第1 層的所有向量合成為最終的特征向量.在這個例子中,假設(shè)m大于2 并且n大于4,且所有層向量和最終特征向量用零向量填充.
在程序文本中,位置相近的代碼塊的上下文程序相似甚至多數(shù)是相同的,然而這些代碼塊在日志打印決策上又往往是相反的.因此,如何從相似的程序文本中為不同的代碼塊提取不同的特征向量,成為通用日志打印位置決策的關(guān)鍵問題.逆序組合方法考慮使用相對距離替代絕對距離,即使兩個位置相近的代碼塊的上下文程序是相似的,他們的對齊也是不同的.考慮圖4 中N3和N6是兩個目標(biāo)代碼塊,由于N6的第一個左兄弟節(jié)點(diǎn)是N5,N3的第一個左兄弟節(jié)點(diǎn)是N10,因此,N5和N10的子向量對齊.對于目標(biāo)代碼塊N3,N10在最終特征向量的N3同層排布,然而對于目標(biāo)塊N6,N10排布在最終完整特征向量中N6的父層向量部分中.
如圖5所示,日志打印位置決策模型包括一個特征遷移模型和一個分類模型.
?特征遷移模型的輸入是不同軟件或組件的代碼塊特征向量集合;輸出是一個新的特征向量集合,該集合中的特征向量與輸入的特征向量一一對應(yīng).特征遷移模型可以利用不同的特征空間的特征向量學(xué)習(xí)到一個共享特征空間,進(jìn)而將不同軟件或組件的代碼塊特征向量映射到共享特征空間去;
?分類模型的輸入是共享特征空間的代碼塊特征向量,輸出是對該代碼塊是否添加日志打印語句的決策結(jié)果.
Fig.5 L ogging point decision model圖5 日志打印位置決策模型
下面分別介紹這兩個子模型.
特征遷移模型采用兩種經(jīng)典的特征遷移算法——遷移成分分析算法(transfer co mponent a nalysis,簡稱TCA)[18]和聯(lián)合分配適配算法(JointDistribution adaptation,簡稱JDA)[19]將源系統(tǒng)特征向量和目標(biāo)系統(tǒng)特征向量映射到新的特征空間.TCA 算法假設(shè)源系統(tǒng)特征向量集合和目標(biāo)系統(tǒng)特征向量集合分別為XS和XT.TCA 利用邊緣概率分布來估計源系統(tǒng)特征向量和目標(biāo)系統(tǒng)特征向量之間的差異.令一組數(shù)據(jù)集合X的邊緣概率分布為P(X),顯然,P(XS)≠P(XT).TCA 的目標(biāo)是獲取一個轉(zhuǎn)換函數(shù)φ,使得P(φ(XS))≈P(φ(XT)).這樣,φ(XS)和φ(XT)是獨(dú)立且同分布的.為計算該轉(zhuǎn)換函數(shù),TCA 首先使用最大均值差異(maximum m ean di screpancy,簡稱MMD)來衡量P(XS)和P(XT)之間的距離,計算公式如下:
無極之道里沒有一個壞人,也沒有一個好人,在這個虛構(gòu)的寓言里,他們都是最為真實(shí)的人。兒時的傾城為了活命欺騙了一個純真的孩子,她背叛了她的諾言。恨意在無歡心里增長,從此他缺乏安全感并且工于心計,并以此來保護(hù)自己。在大將軍光明面前,他打心里認(rèn)為自己永遠(yuǎn)是個二流貨色,他的自卑帶給他無窮的恐懼。傾城選擇了滿神給出的命運(yùn),滿神又改變了大將軍光明的命運(yùn),大將軍光明與之抗?fàn)幰沧⒍ㄊ?。無極之道的悲劇在于自然人性與命運(yùn)抗?fàn)幍淖⒍ㄊ ?/p>
其中,n1和n2表示訓(xùn)練向量和測試向量的數(shù)量.然后,TCA 引入一個計算內(nèi)核獲取滿足dist(XS,XT)取最小值的最優(yōu)值.訓(xùn)練完畢后,XS和XT分別由φ(XS)和φ(XT)取代.
同TCA 不同,JDA 不但使用邊緣概率分布來估計源系統(tǒng)特征向量和目標(biāo)系統(tǒng)特征向量之間的差異,同時還考慮兩者之間的條件概率分布差異.條件概率分布可以被形式化為P(YS|XS)和P(YT|XT).JDA 的目標(biāo)是獲取一個轉(zhuǎn)換矩陣AT,使得P(YS|AT(XS))≈P(YT|AT(XT)).為計算該轉(zhuǎn)換矩陣,JDA 同樣使用MMD 來衡量XS和XT的距離.但是,由于目標(biāo)系統(tǒng)特征向量集合沒有標(biāo)簽數(shù)據(jù),因此YT是未知的.為生成YT,JDA 使用源系統(tǒng)特征向量集合訓(xùn)練一個簡單的分類器(XS,YS),然后對XT進(jìn)行標(biāo)注,進(jìn)而得到仿造的標(biāo)簽,并以替代YT.訓(xùn)練完成后,XS被ATφ(XS)取代,XT被ATφ(XT)取代.
分類模型采用3 種經(jīng)典的機(jī)器學(xué)習(xí)算法,包括支持向量機(jī)(support vector machine,簡稱SVM)、k-最近鄰(knearest neighbor,簡稱kNN)和Logistic 回歸(logistic regression,簡稱LR).SVM 的基本思路是,在共享特征空間中學(xué)習(xí)能夠決策日志打印的最大邊距超平面.kNN 算法的分類決策依據(jù)代碼塊在共享特征空間中最近鄰的幾個代碼塊所屬的類別,如果與一個代碼塊相似的若干其他代碼塊中均包含日志打印語句,則該代碼塊也應(yīng)包含日志打印語句.LR 的因變量即是否應(yīng)添加日志打印語句,自變量是使用經(jīng)過特征遷移后的代碼塊共享特征向量,經(jīng)過回歸分析,可以得到特征向量中的每一個維度對因變量的影響權(quán)重,進(jìn)而判定目標(biāo)系統(tǒng)代碼塊共享特征向量的因變量值.
為了評估所提出的方法,實(shí)驗使用Apache Hadoop[9],Angel[10],OpenStack[11],SaltCloud[12]和Tensorflow[13]等5個流行的大型開源軟件系統(tǒng)源代碼進(jìn)行了兩組實(shí)驗.Hadoop 是當(dāng)今最流行的大數(shù)據(jù)分析平臺之一,Angel 是騰訊開源的分布式機(jī)器學(xué)習(xí)平臺,OpenStack 和SaltCloud 是兩個開源云計算平臺,Tensorflow 是Google 開源的深度學(xué)習(xí)平臺.其中,Hadoop 和Angel 由Java 語言編寫,OpenStack,SaltCloud 和Tensorflow 由Python 語言編寫.
這兩組實(shí)驗包括多場景評估實(shí)驗和各階段評估實(shí)驗:多場景評估旨在驗證本文所提出的跨組件、跨軟件系統(tǒng)的日志打印決策方法在不同應(yīng)用場景下的有效性;各階段評估旨在分別評估特征向量生成和日志打印位置決策模型的效果.第4.2 節(jié)和第4.3 節(jié)詳細(xì)介紹這兩組實(shí)驗的實(shí)驗結(jié)果.本節(jié)接下來介紹實(shí)驗過程中的數(shù)據(jù)處理、基線設(shè)置、參數(shù)設(shè)置、評價指標(biāo)等.
4.1.1 實(shí)驗參數(shù)設(shè)置與數(shù)據(jù)處理
實(shí)驗參數(shù)的選擇,可能會影響實(shí)驗結(jié)果.在特征生成步驟,存在3 個關(guān)鍵參數(shù)需要預(yù)設(shè),包括子向量長度l、子節(jié)點(diǎn)數(shù)量上限m和層數(shù)量上限n.實(shí)驗中,這3 個參數(shù)的預(yù)設(shè)值分別為50,10 和10,使得最終特征向量的長度為5 000(l×m×n).為提升訓(xùn)練速度,實(shí)驗中使用了PCA 算法對特征向量降維,在保證95%以上數(shù)據(jù)方差的基礎(chǔ)上,將特征向量降至200 維.實(shí)驗過程中使用了若干種不同的參數(shù)取值,實(shí)驗結(jié)果對參數(shù)不敏感.由于論文長度限制,在本節(jié)并未將所有實(shí)驗結(jié)果一一列舉.
4.1.2 評價指標(biāo)
評價指標(biāo)采用使用經(jīng)典的機(jī)器學(xué)習(xí)算法評價指標(biāo)準(zhǔn)確率(accuracy)和F1 值.
?Accuracy指日志打印決策正確的代碼塊占所有代碼塊的比例,它反映了日志打印決策模型的整體性能,計算如下:
?F1 指標(biāo)精確率(precision)和召回率(recall)的調(diào)和平均值,代表模型對正樣本的分類效果.高精確率意味著多數(shù)被分類為需要打印日志的代碼塊都是正確的,高召回率則意味著多數(shù)打印日志的代碼塊被正確地分類.F1 反映了模型能夠精確且全面地識別包含日志打印語句的代碼塊的性能,其計算公式如下:
F1=(2×Precision×Recall)/(Precision+Recall).
4.1.3 相關(guān)工作對比
日志打印位置決策任務(wù)的相關(guān)研究工作主要有LogAdvisor 和LogOptPlus,然而這些工作存在若干限制.表1 列舉了本文的方法同這些工作的對比.相關(guān)工作均針對特殊類型的代碼塊和特定的日志級別,同時對編程語言有一定的限制,僅支持C#,Java 等高級編程語言,無法支持C 語言以及一些腳本語言.本文所述方法是一種針對所有代碼塊的通用日志打印位置決策方法,在根本目的上與現(xiàn)有工作有較大區(qū)別.如果僅對比特定代碼塊的日志打印決策效果對本文的方法不公平,如果對比所有代碼塊的日志打印決策效果則對相關(guān)工作不公平,因此實(shí)驗中沒有同相關(guān)工作進(jìn)行決策效果對比.實(shí)驗選取了LogAdvisor 中所對比的方法——隨機(jī)添加日志打印語句(random error logging)作為基線,并隨機(jī)測試5 次取平均以減少實(shí)驗結(jié)果的偏差.
Table 1 Comparison on related works表1 相關(guān)工作對比
在這個實(shí)驗中,我們首先定義了3 個場景,包括版本升級、組件開發(fā)和系統(tǒng)開發(fā).根據(jù)編程語言的不同,5 個軟件系統(tǒng)被分為兩組:Python 組和Java 組,分別在兩組實(shí)驗系統(tǒng)上測試3 種場景下日志打印位置決策模型的效率.如表2所示:在版本升級場景中,選擇軟件系統(tǒng)的舊版本代碼作為訓(xùn)練集,新版本的代碼選作測試集,驗證和評估所提出的方法在跨版本日志打印位置決策中的效率;在組件開發(fā)場景中,選擇一個組件的代碼作為訓(xùn)練集,同一系統(tǒng)的另一個組件的代碼作為測試集,驗證和評估所提出的方法在跨組件日志打印位置決策中的效率;在系統(tǒng)開發(fā)場景中,選擇一個系統(tǒng)的代碼進(jìn)行訓(xùn)練,另一個系統(tǒng)的代碼進(jìn)行測試,驗證和評估所提出的方法在跨系統(tǒng)日志打印決策中的效率.
Table 2 Design of multiple scenario experiment表2 多場景評估實(shí)驗設(shè)計
實(shí)驗結(jié)果如圖6所示.
?在版本升級場景下評估跨版本的日志打印位置決策模型(如圖6(a)所示),Python 組實(shí)現(xiàn)了0.692 的準(zhǔn)確率和0.525 的F1 指標(biāo);同時,Java 組達(dá)到了0.965 的準(zhǔn)確率和0.890 的F1;
?在組件開發(fā)場景下評估跨組件的日志打印位置決策模型(如圖6(b)所示),Python 組實(shí)驗得到了0.659的準(zhǔn)確率和0.690 的F1,Java 組實(shí)驗中達(dá)到了0.960 的準(zhǔn)確率和0.866 的F1;
?在系統(tǒng)開發(fā)場景下評估跨系統(tǒng)的日志打印位置決策模型(如圖 6(c)所示),Python 組的實(shí)驗以TensorFlow 為測試集時達(dá)到0.663 的準(zhǔn)確率和0.529 的F1,使用SaltCloud 作為測試集時準(zhǔn)確率達(dá)到0.773,F1 達(dá)到0.565;在Java 組實(shí)驗中達(dá)到0.969 的準(zhǔn)確率和0.925 的F1.同基線(RandomErrorLogging)相比,Python 組提升了近20%的準(zhǔn)確率,Java 組則提升了40%以上的準(zhǔn)確率.
Fig.6 Results of multiple scenario experiment圖6 多場景評估實(shí)驗結(jié)果
上述實(shí)驗結(jié)果表明:本方法在3 種典型場景和5 種流行的軟件系統(tǒng)上都取得了良好的表現(xiàn),在Java 組中達(dá)到0.95 的準(zhǔn)確率和0.85 的F1,在Python 組中達(dá)到超過0.65 的準(zhǔn)確率和0.5 的F1.更進(jìn)一步的,本方法在新系統(tǒng)開發(fā)場景下的跨系統(tǒng)日志打印位置決策表現(xiàn)最佳,準(zhǔn)確率比另外兩類場景高出約0.1.其原因在于:在新系統(tǒng)開發(fā)場景中將整個系統(tǒng)的源代碼作為訓(xùn)練集,而在另外兩種場景下僅選取一個組件的源代碼用于訓(xùn)練,訓(xùn)練集的大小可能影響分類模型的性能.值得注意的是:本方法在Java 組中取得了更好的效果,遠(yuǎn)超Python 組.如圖7所示,3 個場景中Java 組的準(zhǔn)確性均比python 組高20%左右.究其原因:
?Python 的編程風(fēng)格更加靈活,且支持多種易用功能強(qiáng)大的語法,特征向量生成方法將代碼視為純文本,并側(cè)重于提取文本特征.因此,類似功能的不同實(shí)現(xiàn)所生成的特征有較大差異,導(dǎo)致決策模型的效果欠佳;
?而Java 語言則存在更好的異常和錯誤處理機(jī)制,日志打印語句往往在這些異常和錯誤處理代碼中出現(xiàn).這使得特征向量生成更容易捕獲包含日志打印語句的代碼塊和未包含日志打印語句的代碼塊之間的差異,決策模型表現(xiàn)更良好.
Fig.7 Comparison of results of Python group and Java group圖7 Python 組和Java 組實(shí)驗結(jié)果對比
本實(shí)驗旨在評估特征向量生成步驟與日志打印決策模型的效果.在特征向量生成評估中,僅利用基礎(chǔ)分類模型,包括Logistic 回歸(logistic regr ession,簡稱LR)、k-最近鄰(k-nearest n eighbor,簡稱kNN)和支持向量機(jī)(support vect or m achine,簡稱SVM)的分類效果來評估所生成的特征向量的質(zhì)量.在日志打印決策評估中,則對比分析了加入遷移學(xué)習(xí)模型后和僅使用基礎(chǔ)分類模型的效果.
圖8 為特征向量生成步驟的實(shí)驗結(jié)果.
?在版本升級(跨版本決策)場景中,Java 組的平均準(zhǔn)確率為0.959,平均F1 為0.865;在Python 組中,平均準(zhǔn)確度為0.664,平均F1 為0.469;
?在新組件開發(fā)(跨組件決策)場景中,Java 組的平均準(zhǔn)確率為0.943,平均F1 為0.838;同時,Python 組的平均準(zhǔn)確率為0.649,平均F1 為0.644;
?在新的系統(tǒng)開發(fā)(跨系統(tǒng)決策)場景中,Java 組的平均準(zhǔn)確率為0.960,平均F1 為0.899;而Python 組的平均準(zhǔn)確率為0.667,平均F1 為0.527.
結(jié)果表明,特征向量生成方法可以有效地從源代碼中提取特征向量.即使使用基本的簡單分類模型,Java 組中的實(shí)驗結(jié)果也達(dá)到0.9 以上的精確度和0.8 以上的F1.
Fig.8 Experiment result of feature vector generation圖8 特征向量生成步驟效果驗證實(shí)驗結(jié)果
圖9 展示了日志打印決策步驟的實(shí)驗結(jié)果.
?Python 組:在版本升級(跨版本決策)場景中,TCA 和SVM 模型組合達(dá)到最佳準(zhǔn)確率0.692,而JDA 和KNN 模型的組合得到最佳F1 為0.525;在新組件開發(fā)(跨組件決策)場景中,TCA 和SVM 模型的組合達(dá)到最佳準(zhǔn)確率為0.690,TCA 和LR 模型的組合達(dá)到最佳F1 為0.695;在新的系統(tǒng)開發(fā)(跨系統(tǒng)決策)場景中,JDA 和KNN 模型的組合達(dá)到的最佳準(zhǔn)確率為0.663,最佳F1 為0.529;
?Java 組:TCA 和LR 模型的組合在版本升級(跨版本決策)場景中達(dá)到最佳準(zhǔn)確率為0.962,最佳F1 為0.878;在新組件開發(fā)(跨組件決策)方案中,JDA 和KNN 的最佳準(zhǔn)確率為0.960,最佳F1 為0.866;在新的系統(tǒng)開發(fā)(跨系統(tǒng)決策)場景中,TCA 和SVM 的組合達(dá)到0.965 的最佳準(zhǔn)確率和0.912 的最佳F1.
與簡單分類模型相比,Python 組實(shí)驗中遷移學(xué)習(xí)有效地提高了2%~9%的準(zhǔn)確率和1%~12%的F1.在版本升級(跨版本決策)場景中,TCA 和SVM 模型的組合比SVM 的最優(yōu)精度提高了3%,而JDA 和KNN 模型組合的F1 比KNN 模型提高了7.3%;在新組件開發(fā)(跨組件決策)場景中,TCA 和SVM 模型的組合比SVM 基線的最高精度提升了2.3%,TCA 和LR 模型的F1 比LR 基線提升11.1%;在新軟件系統(tǒng)開發(fā)(跨系統(tǒng)決策)場景中,JDA 和KNN 模型的組合達(dá)到最佳精度和F1,與KNN 基線相比,它提高了8.6%的準(zhǔn)確率和1.2%的F1.
在Java 組中,遷移學(xué)習(xí)的平均準(zhǔn)確率和F1 降低1%左右.在版本升級場景和新軟件系統(tǒng)開發(fā)(跨版本和跨系統(tǒng)決策)場景中,TCA 和LR 模型的組合平均下降約0.8%的準(zhǔn)確率和1.9%的F1;在新組件開發(fā)(跨組件決策)場景中,JDA 的準(zhǔn)確率提高了3.3%,F1 提高了1.1%.Java 組中采用遷移學(xué)習(xí)后準(zhǔn)確率和F1 值下降可能是由于源域和目標(biāo)域的特征向量之間的分布差異較小,沒有明顯適合遷移的部分,導(dǎo)致出現(xiàn)負(fù)遷移的情況.所謂負(fù)遷移即遷移學(xué)習(xí)在轉(zhuǎn)化和評估過程中的遷移損失大于遷移增益.在Java 組的實(shí)驗中,基本模型的結(jié)果良好,意味著源域和目標(biāo)域之間沒有明顯的分布差異,因此在遷移學(xué)習(xí)轉(zhuǎn)化過程中帶來的損失占據(jù)主導(dǎo).盡管在Java 組的部分實(shí)驗中存在性能下降,但遷移學(xué)習(xí)模型在Java 組中總體表現(xiàn)仍然出色,能夠說明日志打印決策模型的有效性.
Fig.9 Experiment result of logging point decision models圖9 日志打印位置決策模型效果驗證
請讀者查閱表3 獲取詳細(xì)的實(shí)驗結(jié)果數(shù)值,其中,模型列列舉了實(shí)驗中使用的特征遷移模型和分類模型算法,其他列列舉了Java 和Python 組中不同場景的實(shí)驗結(jié)果.表中黑體部分代表每一個場景的實(shí)驗中的最優(yōu)結(jié)果.
Table 3 Experiment results表3 實(shí)驗結(jié)果匯總
本節(jié)討論實(shí)驗中涉及的可能影響實(shí)驗結(jié)果的因素.
?實(shí)驗選取了有限的5 個不同語言的不同項目,劃分3 個場景進(jìn)行實(shí)驗,希望能夠在跨組件、跨軟件系統(tǒng)的日志打印位置決策問題上進(jìn)行初步探索.未來工作中會加大實(shí)驗規(guī)模,以EcoSystem 為單位驗證并優(yōu)化本文的方法.目前,已經(jīng)收集了NPM 生態(tài)系統(tǒng)中21 個項目、NVIDIA 生態(tài)系統(tǒng)中14 個項目、Pytorch 生態(tài)系統(tǒng)下17 個項目、Apache 生態(tài)系統(tǒng)下152 個項目、Chrome 下13 個項目以及Eclipse下13 個項目,未來我們會在這些項目上對本方法進(jìn)行實(shí)驗;
?在跨軟件系統(tǒng)決策場景實(shí)驗中,從Hadoop 不包含日志打印語句的383 9 72 個代碼塊中隨機(jī)抽樣出13 4 70 個代碼塊作為負(fù)樣本,使用共計26 94 0 個代碼塊作為測試集.在版本升級和跨組件決策場景實(shí)驗中,HDFS 組件110 396 個代碼塊中,4 242 個代碼塊包含日志打印語句,從106 154 個不包含日志打印語句的代碼塊中隨機(jī)采樣了4 242 個代碼塊作為負(fù)樣本,使用共計8 484 個樣本作為訓(xùn)練集.對于深度學(xué)習(xí)模型而言,該量級的訓(xùn)練數(shù)據(jù)過少,但是對于本文所使用的機(jī)器學(xué)習(xí)模型而言,這個量級的數(shù)據(jù)是可以訓(xùn)練出有效的分類模型的;
?本文所述方法是一種針對所有代碼塊的通用日志打印位置決策方法,在根本目的上與現(xiàn)有工作有較大區(qū)別.如果僅對比特定代碼塊的日志打印決策效果對本文的方法不公平,如果對比所有代碼塊的日志打印決策效果則對相關(guān)工作不公平.未來,我們會修改相關(guān)工作(LogAdvisor 和LogOptPlus)使之支持Java 語言和Python 語言,并在特殊代碼片段的日志打印決策問題上進(jìn)行定量的對比實(shí)驗.
本文主要研究軟件系統(tǒng)的日志打印位置決策問題,即:給定一段代碼,決策與這段代碼相關(guān)的日志打印位置.具體地,為了適用于不同的編程語言,并進(jìn)行跨組件和跨軟件系統(tǒng)的日志打印位置決策,本文提出一種通用的自動化特征向量提取方法,通過構(gòu)建程序?qū)哟螛?屏蔽編程語言與不同程序模塊實(shí)現(xiàn)細(xì)節(jié)的異構(gòu)性,并提出一種基于遷移學(xué)習(xí)的日志打印位置決策模型,利用特征遷移技術(shù)挖掘不同軟件系統(tǒng)日志打印程序的共有特征空間,遷移有用信息削減特征差異.在未來的工作中,擬加大實(shí)驗規(guī)模,對本方法進(jìn)行更加充分的驗證.另外,擬從特征生成和模型構(gòu)建步驟優(yōu)化現(xiàn)有方法,使之進(jìn)一步支持跨編程語言不同軟件系統(tǒng)的日志打印位置決策,擬進(jìn)一步研究如何利用深度學(xué)習(xí)技術(shù)(如深度遷移學(xué)習(xí)等)提升日志打印位置決策效果;與此同時,擬研究日志打印變量和常量的自動化決策方法,以實(shí)現(xiàn)完全自動化的日志打印語句撰寫.