專利名稱:程序日志記錄優(yōu)化方法和系統(tǒng)的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及應(yīng)用程序日志技術(shù)領(lǐng)域。更具體地,本發(fā)明尤其涉及通過將應(yīng)用程序中原有的日志方法進(jìn)行優(yōu)化并重新注入應(yīng)用程序的方法和系統(tǒng)。
背景技術(shù):
應(yīng)用程序的日志方法(Log Method)是在應(yīng)用程序開發(fā)時(shí)被注入程序自身代碼中的一些指令,用于在程序運(yùn)行時(shí)記錄所發(fā)生的各種事件,對(duì)程序的運(yùn)行進(jìn)行監(jiān)控,從而有助于理解系統(tǒng)及程序的運(yùn)行狀態(tài)并對(duì)出現(xiàn)的問題進(jìn)行診斷。對(duì)于缺乏用戶交互性的應(yīng)用程序而言,日志記錄工作尤為重要。例如,為了監(jiān)控一個(gè)應(yīng)用程序在運(yùn)行時(shí)出現(xiàn)的網(wǎng)絡(luò)連接錯(cuò)誤,可以在該程序中插入相關(guān)的日志方法,將出現(xiàn)網(wǎng)絡(luò)連接錯(cuò)誤所對(duì)應(yīng)的IP地址、出錯(cuò)時(shí)間等信息記錄下來,存儲(chǔ)在日志文件中,以便程序管理員對(duì)其進(jìn)行分析、診斷。有研究顯示,一個(gè)應(yīng)用程序中大約有5%的代碼是專門用于記錄程序日志的?,F(xiàn)有的程序日志系統(tǒng)如圖2所示:應(yīng)用程序201中包含程序自身的代碼以及用于日志記錄的日志方法的代碼。在實(shí)時(shí)運(yùn)行環(huán)境202下,應(yīng)用程序在運(yùn)行過程中可能會(huì)被觸發(fā)日志記錄,通過執(zhí)行日志方法203,可以生成日志信息204。日志信息204通常以文件的形式存在,存儲(chǔ)于硬盤或其它存儲(chǔ)介質(zhì)上。目前,程序日志記錄主要存在兩大問題。其一是存儲(chǔ)日志文件會(huì)耗費(fèi)大量的硬盤資源。在程序運(yùn)行過程中,會(huì)有大量的日志信息被記錄在硬盤或其它存儲(chǔ)裝置中,并且日志信息的增長(zhǎng)是不受限制的。由于硬盤容量的限制,可能自動(dòng)清除舊的日志信息,從而導(dǎo)致重要信息丟失。其二,記錄大量的日志信息會(huì)導(dǎo)致頻繁的10(輸入輸出)操作,從而降低了應(yīng)用程序運(yùn)行的速度。現(xiàn)有技術(shù)中存在解決上述問題的技術(shù)方案。根據(jù)其中一種現(xiàn)有技術(shù)方案是通過根據(jù)性能開銷(Performance Overhead)來調(diào)整日志策略,性能開銷指的是由日志記錄操作占用的計(jì)算資源。這種現(xiàn)有技術(shù)方案的實(shí)質(zhì)是以犧牲日志信息的完整性為代價(jià)來換取性能的提升,同樣存在日志信息丟失的問題,并且其只能在應(yīng)用程序開發(fā)時(shí)采用,而無法在不修改已有的程序代碼和日志記錄機(jī)制(legacy mechanism)的前提下減小日志文件的大小。另一種現(xiàn)有技術(shù)方案是通過人工手動(dòng)地更改已有的日志記錄機(jī)制,但需要耗費(fèi)大量的人力和時(shí)間,需要對(duì)程序代碼的深入理解,在實(shí)踐中并不可行。
發(fā)明內(nèi)容
考慮到上述存在的問題,本發(fā)明的目的之一在于提供一種減小日志信息存儲(chǔ)量的應(yīng)用程序日志記錄優(yōu)化方法和系統(tǒng)。本發(fā)明的又一目的在于提供一種能夠降低日志記錄操作對(duì)應(yīng)用程序的運(yùn)行所造成的性能影響的應(yīng)用程序日志記錄優(yōu)化方法和系統(tǒng)。本發(fā)明的再一目的在于提供一種無需改變已有的應(yīng)用程序中的日志記錄機(jī)制,就可以減小日志信息存儲(chǔ)量降低日志記錄操作對(duì)應(yīng)用程序的運(yùn)行所造成的性能影響的應(yīng)用程序日志記錄優(yōu)化方法和系統(tǒng)。
根據(jù)本發(fā)明的一個(gè)方面,提供了一種用于優(yōu)化應(yīng)用程序日志記錄的方法,包括:識(shí)別應(yīng)用程序中的原日志方法;將所述原日志方法中的參數(shù)分為常量部分和變量部分;建立所述常量部分和變量部分間的對(duì)應(yīng)關(guān)系標(biāo)識(shí);利用所述常量部分、變量部分以及對(duì)應(yīng)關(guān)系標(biāo)識(shí),構(gòu)造優(yōu)化日志方法;以及通過代碼注入,將所述應(yīng)用程序中的原日志方法替換為所述優(yōu)化日志方法。根據(jù)本發(fā)明的一個(gè)實(shí)施例,對(duì)應(yīng)于常量部分的日志信息僅被記錄一次,并且所述對(duì)應(yīng)于變量部分的日志信息在每次被觸發(fā)時(shí)均被記錄。根據(jù)本發(fā)明的另一方面,提供了一種用于優(yōu)化應(yīng)用程序日志記錄的系統(tǒng),包括日志方法識(shí)別裝置,被配置為識(shí)別應(yīng)用程序中的原日志方法;參數(shù)劃分裝置,被配置為將所述原日志方法中的字符串參數(shù)分為常量部分和變量部分;標(biāo)識(shí)建立裝置,被配置為建立所述常量部分和變量部分間的對(duì)應(yīng)關(guān)系標(biāo)識(shí);優(yōu)化日志方法構(gòu)造裝置,被配置為利用所述常量部分、變量部分以及對(duì)應(yīng)關(guān)系標(biāo)識(shí),構(gòu)造優(yōu)化日志方法;以及日志方法替換裝置,被配置為通過代碼注入,將所述應(yīng)用程序中的原日志方法替換為所述優(yōu)化日志方法。根據(jù)本發(fā)明的方法和系統(tǒng),可以減小日志信息存儲(chǔ)量并降低日志記錄的IO操作,從而減小對(duì)應(yīng)用程序的運(yùn)行所造成的性能影響。同時(shí),代碼的注入可在目標(biāo)代碼層面實(shí)現(xiàn),并且無需改變已有的應(yīng)用程序中的日志記錄機(jī)制——觸發(fā)日志記錄的條件以及最終生成的日志記錄與利用原日志方法的情況下是一致的。
通過對(duì)結(jié)合附圖所示出的實(shí)施方式進(jìn)行詳細(xì)說明,本發(fā)明的上述以及其他特征將更加明顯,本發(fā)明附圖中相同的標(biāo)號(hào)表示相同或相似的部件。在附圖中,圖1示出了適于用來實(shí)現(xiàn)本發(fā)明實(shí)施方式的示例性計(jì)算系統(tǒng)100的框圖;圖2示出了現(xiàn)有技術(shù)中的程序日志系統(tǒng)的組成模塊圖;圖3示出了根據(jù)本發(fā)明一實(shí)施例的用于優(yōu)化應(yīng)用程序日志記錄的方法的流程圖;圖4示出了根據(jù)本發(fā)明另一實(shí)施例的用于優(yōu)化應(yīng)用程序日志記錄的方法的流程圖;圖5示出了根據(jù)本發(fā)明一實(shí)施例的用于優(yōu)化應(yīng)用程序日志記錄的系統(tǒng)的框圖;圖6A示出了根據(jù)本發(fā)明一實(shí)施例的原日志文件和優(yōu)化日志文件的示意圖;圖6B示出了根據(jù)本發(fā)明一實(shí)施例的利用優(yōu)化日志文件記錄日志的示意圖;圖7示出了根據(jù)本發(fā)明一實(shí)施例的程序日志系統(tǒng)的組成模塊圖。
具體實(shí)施例方式在下文中,將參考附圖通過實(shí)施方式對(duì)本發(fā)明提供的用于優(yōu)化應(yīng)用程序日志記錄的方法和系統(tǒng)進(jìn)行詳細(xì)地描述。所屬技術(shù)領(lǐng)域的技術(shù)人員知道,本發(fā)明的多個(gè)方面可以體現(xiàn)為系統(tǒng)、方法或計(jì)算機(jī)程序產(chǎn)品。因此,本發(fā)明的多個(gè)方面可以具體實(shí)現(xiàn)為以下形式,即,可以是完全的硬件、完全的軟件(包括固件、駐留軟件、微代碼等)、或者本文一般稱為“電路”、“模塊”或“系統(tǒng)”的軟件部分與硬件部分的組合。此外,本發(fā)明的多個(gè)方面還可以采取體現(xiàn)在一個(gè)或多個(gè)計(jì)算機(jī)可讀介質(zhì)中的計(jì)算機(jī)程序產(chǎn)品的形式,該計(jì)算機(jī)可讀介質(zhì)中包含計(jì)算機(jī)可用的程序碼。
可以使用一個(gè)或多個(gè)計(jì)算機(jī)可讀的介質(zhì)的任何組合。計(jì)算機(jī)可讀介質(zhì)可以是計(jì)算機(jī)可讀信號(hào)介質(zhì)或者計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)。計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)例如可以是一但不限于——電的、磁的、光的、電磁的、紅外線的、或半導(dǎo)體的系統(tǒng)、裝置、器件或任何以上的組合。計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)的更具體的例子(非窮舉的列表)包括以下:有一個(gè)或多個(gè)導(dǎo)線的電連接、便攜式計(jì)算機(jī)磁盤、硬盤、隨機(jī)存取存儲(chǔ)器(RAM)、只讀存儲(chǔ)器(ROM)、可擦式可編程只讀存儲(chǔ)器(EPR0M或閃存)、光纖、便攜式緊湊磁盤只讀存儲(chǔ)器(CD-ROM)、光存儲(chǔ)器件、磁存儲(chǔ)器件、或者上述的任何合適的組合。在本文件的語境中,計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)可以是任何包含或存儲(chǔ)程序的有形的介質(zhì),該程序被指令執(zhí)行系統(tǒng)、裝置或者器件使用或者與其結(jié)合使用。計(jì)算機(jī)可讀的信號(hào)介質(zhì)可包括在基帶中或者作為載波一部分傳播的、其中體現(xiàn)計(jì)算機(jī)可讀的程序碼的傳播的數(shù)據(jù)信號(hào)。這種傳播的信號(hào)可以采用多種形式,包括——但不限于——電磁信號(hào)、光信號(hào)或任何以上合適的組合。計(jì)算機(jī)可讀的信號(hào)介質(zhì)可以是并非為計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)、但是能發(fā)送、傳播或者傳輸用于由指令執(zhí)行系統(tǒng)、裝置或者器件使用或者與其結(jié)合使用的程序的任何計(jì)算機(jī)可讀介質(zhì)。計(jì)算機(jī)可讀介質(zhì)上包含的程序代碼可以用任何適當(dāng)?shù)慕橘|(zhì)傳輸,包括——但不限于——無線、電線、光纜、RF等等,或者任何合適的上述組合。計(jì)算機(jī)可讀介質(zhì)上包含的程序代碼可以用任何適當(dāng)?shù)慕橘|(zhì)傳輸,包括一但不限于——無線、電線、光纜、RF等等,或者任何合適的上述組合。用于執(zhí)行本發(fā)明的操作的計(jì)算機(jī)程序碼,可以以一種或多種程序設(shè)計(jì)語言的任何組合來編寫,所述程序設(shè)計(jì)語言包括面向?qū)ο蟮某绦蛟O(shè)計(jì)語言-諸如Java、Smalltalk、C++之類,還包括常規(guī)的過程式程序設(shè)計(jì)語言-諸如“C”程序設(shè)計(jì)語言或類似的程序設(shè)計(jì)語言。程序碼可以完全地在用戶的計(jì)算上執(zhí)行、部分地在用戶的計(jì)算機(jī)上執(zhí)行、作為一個(gè)獨(dú)立的軟件包執(zhí)行、部分在用戶的計(jì)算機(jī)上部分在遠(yuǎn)程計(jì)算機(jī)上執(zhí)行、或者完全在遠(yuǎn)程計(jì)算機(jī)或服務(wù)器上執(zhí)行。在后一種情形中,遠(yuǎn)程計(jì)算機(jī)可以通過任何種類的網(wǎng)絡(luò)一包括局域網(wǎng)(LAN)或廣域網(wǎng)(WAN)-連接到用戶的計(jì)算機(jī),或者,可以(例如利用因特網(wǎng)服務(wù)提供商來通過因特網(wǎng))連接到外部計(jì)算機(jī)。以下參照按照本發(fā)明實(shí)施例的方法、裝置(系統(tǒng))和計(jì)算機(jī)程序產(chǎn)品的流程圖和/或框圖描述本發(fā)明的多個(gè)方面。要明白的是,流程圖和/或框圖的每個(gè)方框以及流程圖和/或框圖中各方框的組合,都可以由計(jì)算機(jī)程序指令實(shí)現(xiàn)。這些計(jì)算機(jī)程序指令可以提供給通用計(jì)算機(jī)、專用計(jì)算機(jī)或其它可編程數(shù)據(jù)處理裝置的處理器,從而生產(chǎn)出一種機(jī)器,使得通過計(jì)算機(jī)或其它可編程數(shù)據(jù)處理裝置執(zhí)行的這些指令,產(chǎn)生實(shí)現(xiàn)流程圖和/或框圖中的方框中規(guī)定的功能/操作的裝置。也可以把這些計(jì)算機(jī)程序指令存儲(chǔ)在能指令計(jì)算機(jī)或其它可編程數(shù)據(jù)處理裝置以特定方式工作的計(jì)算機(jī)可讀介質(zhì)中,這樣,存儲(chǔ)在計(jì)算機(jī)可讀介質(zhì)中的指令產(chǎn)生一個(gè)包括實(shí)現(xiàn)流程圖和/或框圖中的方框中規(guī)定的功能/操作的指令裝置(instruction means)的制造品。也可以把計(jì)算機(jī)程序指令加載到計(jì)算機(jī)或其它可編程數(shù)據(jù)處理裝置上,使得在計(jì)算機(jī)或其它可編程數(shù)據(jù)處理裝置上執(zhí)行一系列操作步驟,以產(chǎn)生計(jì)算機(jī)實(shí)現(xiàn)的過程,從而在計(jì)算機(jī)或其它可編程裝置上執(zhí)行的指令就提供實(shí)現(xiàn)流程圖和/或框圖中的方框中規(guī)定的功能/操作的過程。下面參看圖1。圖1示出了適于用來實(shí)現(xiàn)本發(fā)明實(shí)施方式的示例性計(jì)算系統(tǒng)100的框圖。如所示,計(jì)算機(jī)系統(tǒng)100可以包括:CPU(中央處理單元)101、RAM(隨機(jī)存取存儲(chǔ)器)102、ROM (只讀存儲(chǔ)器)103、系統(tǒng)總線104、硬盤控制器105、鍵盤控制器106、串行接口控制器107、并行接口控制器108、顯示控制器109、硬盤110、鍵盤111、串行外部設(shè)備112、并行外部設(shè)備113和顯示器114。在這些設(shè)備中,與系統(tǒng)總線104耦合的有CPU IOU RAM102,ROM 103、硬盤控制器105、鍵盤控制器106、串行控制器107、并行控制器108和顯示控制器109。硬盤110與硬盤控制器105耦合,鍵盤111與鍵盤控制器106耦合,串行外部設(shè)備112與串行接口控制器107耦合,并行外部設(shè)備113與并行接口控制器108耦合,以及顯示器114與顯示控制器109耦合。應(yīng)當(dāng)理解,圖1所述的結(jié)構(gòu)框圖僅僅為了示例的目的而示出的,而不是對(duì)本發(fā)明范圍的限制。在某些情況下,可以根據(jù)具體情況而增加或者減少某些設(shè)備。圖3示出了根據(jù)本發(fā)明一實(shí)施例的用于優(yōu)化應(yīng)用程序日志記錄的方法的流程圖。圖3所示的方法從步驟301開始。在步驟301中,識(shí)別應(yīng)用程序中的原日志方法。這里,“方法”是面向?qū)ο蟪绦蛑械母拍?,是程序“類”的下層概念,程序代碼包含在“方法”中,所有的“方法”都在“類”中聲明?!霸罩痉椒ā奔粗傅氖窃趹?yīng)用程序開發(fā)過程中即編寫好的用于程序日志記錄的代碼,以區(qū)別于下文中的“優(yōu)化日志方法”。根據(jù)本發(fā)明一實(shí)施例,由于大多數(shù)應(yīng)用程序只提供編譯后的目標(biāo)代碼(binary code),而不提供源代碼(source code),因此通過檢索應(yīng)用程序的目標(biāo)代碼來識(shí)別其中所包含的原日志方法。根據(jù)本發(fā)明另一實(shí)施例,在應(yīng)用程序提供源代碼的情況下,通過檢索其源代碼來識(shí)別原日志方法。關(guān)于具體能夠從程序代碼中識(shí)別出其中包含的日志方法,本領(lǐng)域技術(shù)人員應(yīng)當(dāng)了解,程序中的日志方法都是具有特定名稱的(不管用于編寫何種面向?qū)ο蟪绦?,因此可以通過從程序所有代碼中檢索出符合特定名稱的“方法”,即可識(shí)別出日志方法。例如,java/io/PrintStream.println: (Ljava/lang/String ;) V即為Java代碼中的一個(gè)特定的日志方法,其中java/io/PrintStream.println:是其方法名,:(Ljava/lang/String ;)是該方法的參數(shù)類型,V是方法返回類型。應(yīng)當(dāng)了解,本發(fā)明不限于Java語言,而可以適用于任何面向?qū)ο笳Z言。日志方法可能有很多,有些用于處理字符串參數(shù),有些用于處理非字符串參數(shù)。根據(jù)本發(fā)明一實(shí)施例,在步驟301中識(shí)別原日志方法是指僅識(shí)別用于處理字符串參數(shù)(String Parameter)的日志方法。根據(jù)本發(fā)明另一實(shí)施例,在步驟301中識(shí)別原日志方法可以識(shí)別出所有的日志方法,然后在后續(xù)的步驟中在過濾掉那些非用于處理字符串參數(shù)的日志方法。接下來,在步驟302中,將所識(shí)別出的原日志方法中的字符串參數(shù)分為常量部分和變量部分。顧名思義,“常量部分”指的是無論程序運(yùn)行時(shí)產(chǎn)生何種日志內(nèi)容,該部分字符串的內(nèi)容都是固定的。而“變量部分”則指該部分字符串的內(nèi)容在記錄日志過程中可能發(fā)生變化。如圖6A所示的原日志方法的示例,其括號(hào)內(nèi)的部分即為日志方法System, out.println處理的字符串參數(shù),其中的“It’s not able to get connection from”以及“now”在日志記錄中不會(huì)發(fā)生變化,因此屬于字符串參數(shù)的常量部分,而ip則指具體的IP地址,顯然是依具體地址而發(fā)生改變的,因此屬于字符串參數(shù)的變量部分。通常,字符串參數(shù)的常量部分和變量部分在源代碼中的字面表達(dá)具有明顯的差別,例如是否具有引號(hào)(“”)等,在目標(biāo)代碼中相應(yīng)地也具有明顯的差別,可以利用檢索其參數(shù)指令特征來判斷究竟是常量字符串還是變量字符串。圖4及相應(yīng)的文字部分將具體介紹識(shí)別常量部分和變量部分的實(shí)施例。在步驟303中,建立所述常量部分和變量部分間的對(duì)應(yīng)關(guān)系標(biāo)識(shí)。根據(jù)本發(fā)明一實(shí)施例,對(duì)應(yīng)關(guān)系標(biāo)識(shí)為特定的ID。例如,將圖6A中的常量部分和變量部分均賦予特定的對(duì)應(yīng)關(guān)系標(biāo)識(shí)建立對(duì)應(yīng)關(guān)系標(biāo)識(shí)的原因是為了在后續(xù)步驟中將常量部分和變量部分分開處理時(shí)不會(huì)丟失兩者間的關(guān)聯(lián)關(guān)系。本領(lǐng)域技術(shù)人員應(yīng)當(dāng)理解,對(duì)應(yīng)關(guān)系標(biāo)識(shí)可能包括很多種,不限于數(shù)字標(biāo)識(shí)、字符標(biāo)識(shí)等,只要能夠?qū)?duì)應(yīng)于原日志方法中所處理的一條字符串參數(shù)中的常量部分和變量部分唯一地關(guān)聯(lián)起來即可。接下來,圖3所示的方法進(jìn)行至步驟304,利用所述常量部分、變量部分以及對(duì)應(yīng)關(guān)系標(biāo)識(shí),構(gòu)造優(yōu)化日志方法。如圖6A箭頭右側(cè)框圖所示,所構(gòu)造的優(yōu)化日志方法中包含原日志方法中的所有參數(shù),但是將原日志方法中的字符串參數(shù)按常量部分和變量部分分開,并均加入了所建立的對(duì)應(yīng)關(guān)系標(biāo)識(shí)。尤其需要注意的是,該框圖中示出的優(yōu)化構(gòu)造方法在方法名中加入了 “ConsAndVar”,表明參數(shù)包含常量和變量?jī)刹糠郑簿鸵馕吨鴪?zhí)行優(yōu)化構(gòu)造方法時(shí)可以將常量部分和變量部分分開記錄。需要指出的是,圖6A中的示例僅僅是針對(duì)Java語言所舉的例子,并且為了便于理解以源代碼的形式展現(xiàn)。本領(lǐng)域技術(shù)人員應(yīng)當(dāng)理解,所有面向?qū)ο笳Z言均可基于本發(fā)明的構(gòu)思執(zhí)行圖3所示的方法,并且大多數(shù)情況下是在目標(biāo)代碼層面執(zhí)行,而非在源代碼層面執(zhí)行。在步驟305中,通過代碼注入,將所述應(yīng)用程序中的原日志方法替換為所構(gòu)造的優(yōu)化日志方法。由于在步驟301識(shí)別出了原日志方法,在步驟304中構(gòu)造了優(yōu)化日志方法,因此可以在步驟305中進(jìn)行替換。替換的目的是為了在運(yùn)行應(yīng)用程序時(shí)執(zhí)行優(yōu)化日志方法,從而將原日志方法中的返回參數(shù)分成常量、變量?jī)刹糠诌M(jìn)行記錄,由于常量中的字符串內(nèi)容固定,因此只需記錄一次,而變量中的字符串內(nèi)容不固定,因此需要記錄多次。本領(lǐng)域技術(shù)人員應(yīng)當(dāng)理解,在目標(biāo)代碼層面的代碼注入(Code Instrument)技術(shù)屬于本領(lǐng)域的公知技術(shù),因此在本發(fā)明中不做贅述。圖6B示出了根據(jù)本發(fā)明一實(shí)施例的利用優(yōu)化日志文件記錄日志的示意圖。如圖6B所示,箭頭左邊的框圖為執(zhí)行原日志文件所生成的日志記錄,可以看出,執(zhí)行原日志文件時(shí)認(rèn)為參數(shù)是一個(gè)完整的字符串,因此每次觸發(fā)日志記錄(某個(gè)IP地址無法連接)時(shí)均需完整地向日志文件中輸出完整的字符串內(nèi)容,導(dǎo)致“It’ s not able to get connectionfrom”以及“now”出現(xiàn)在每條日志記錄中,長(zhǎng)此以往就會(huì)帶來大量的1/0操作并導(dǎo)致硬盤空間迅速被占用。而圖6B中箭頭右邊的框圖則示出了執(zhí)行如圖6A所示的優(yōu)化日志文件而生成的日志記錄??梢钥闯觯址畢?shù)中的常量部分被記錄在常量日志文件中,且僅記錄一次,其中包含對(duì)應(yīng)關(guān)系標(biāo)識(shí)id#l,而變量部分則被記錄在變量日志文件中,且每次觸發(fā)均記錄。這樣一來,如果需要閱讀完整的日志文件的話,就可以通過對(duì)應(yīng)關(guān)系標(biāo)識(shí)id#l將對(duì)應(yīng)的常量日志文件和變量日志文件組合到一起,生成完整的日志文件??梢岳斫?常量日志文件中可以記錄多個(gè)日志方法的常量參數(shù),而變量日志文件中可以記錄多個(gè)日志方法的變量參數(shù),由于有特定對(duì)應(yīng)關(guān)系標(biāo)識(shí),因此不會(huì)導(dǎo)致在組合日志文件時(shí)發(fā)生錯(cuò)誤。如上所述,利用圖3所示的方法并參考圖6示出的具體實(shí)例,可以減小日志信息存儲(chǔ)量并降低日志記錄的10操作,從而減小對(duì)應(yīng)用程序的運(yùn)行所造成的性能影響。同時(shí),代碼的注入可在目標(biāo)代碼層面實(shí)現(xiàn),并且無需改變已有的應(yīng)用程序中的日志記錄機(jī)制一觸發(fā)日志記錄的條件以及最終生成的日志記錄與利用原日志方法的情況下是完全一致的。圖4示出了根據(jù)本發(fā)明另一實(shí)施例的用于優(yōu)化應(yīng)用程序日志記錄的方法的流程圖。圖4所示的方法從步驟401開始。在步驟401中,檢索應(yīng)用程序的目標(biāo)代碼。接下來在步驟402中,在應(yīng)用程序的類中識(shí)別具有特定名稱且用于處理字符串參數(shù)的原日志方法。步驟401和402對(duì)應(yīng)于圖3中的步驟301,在上文已有過詳細(xì)描述。接下,進(jìn)行至步驟403,定位原日志方法中用于創(chuàng)建字符串參數(shù)的指令。雖然在步驟402中已經(jīng)識(shí)別了處理字符串參數(shù)的原日志方法,但是對(duì)于一個(gè)日志方法而言,其中所包含的指令可能不僅僅是用于創(chuàng)建字符串參數(shù)的指令,因此為了后續(xù)對(duì)字符串參數(shù)進(jìn)行分類,需要定位用于創(chuàng)建字符串參數(shù)的指令??紤]到在面向?qū)ο笳Z言編寫的程序中,通常是先將參數(shù)堆棧再調(diào)用所聲明的方法,根據(jù)本發(fā)明的一個(gè)實(shí)施例,通過利用指針先迭代地找到把參數(shù)壓棧的指令,來定位構(gòu)造字符串參數(shù)的指令。本領(lǐng)域技術(shù)人員應(yīng)當(dāng)理解,可以利用現(xiàn)有技術(shù)找到日志方法中把參數(shù)壓棧的指令。接下來在步驟404中,檢索所定位的用于創(chuàng)建字符串參數(shù)的指令。根據(jù)本發(fā)明的一個(gè)實(shí)施例,檢索所定位的用于創(chuàng)建字符串參數(shù)的指令包括逐行掃描用于創(chuàng)建字符串參數(shù)的指令中的代碼。然后,在步驟405中判斷所檢索的用于創(chuàng)建字符串參數(shù)的指令是否為處理常量字符串的常量參數(shù)指令。根據(jù)本發(fā)明的一個(gè)實(shí)施例,在Java程序中,ldciinumber表示常量字符串操作,因此如果檢索到ldc#number指令(判斷結(jié)果為是),則在步驟406中確定所述指令所創(chuàng)建的字符串參數(shù)為常量部分。相應(yīng)地,如果判斷結(jié)果為否,則在步驟407中確定所述指令所創(chuàng)建的字符串參數(shù)為變量部分。需要指出的是,在非Java的其它面向?qū)ο笳Z言編寫的程序中,本領(lǐng)域技術(shù)人員可以在不脫離本發(fā)明構(gòu)思的前提下,根據(jù)具體的語言規(guī)范來設(shè)計(jì)判斷指令是否用于創(chuàng)建常量字符串的方法。接下來,無論判斷出是常量部分還是變量部分,均進(jìn)行至步驟408,建立所述常量部分和變量部分間的對(duì)應(yīng)關(guān)系標(biāo)識(shí)。步驟408對(duì)應(yīng)于圖3中的步驟303,在此不在贅述。圖4所示的方法進(jìn)行至步驟409。在步驟409中,將對(duì)應(yīng)關(guān)系標(biāo)識(shí)分別加入常量部分和變量部分,并將常量和變量部分合并,以構(gòu)造優(yōu)化日志方法。步驟409的實(shí)現(xiàn)在圖6A中箭頭右側(cè)的框圖中可以得到源代碼層面直觀的展示。如圖6A所示,步驟409中將常量和變量部分合并是指將常量和變量部分放在優(yōu)化日志方法中的一個(gè)大參數(shù)下的兩個(gè)子參數(shù)(new String)結(jié)構(gòu)中,這區(qū)別于原日志方法中用字符串緩沖附加方法(“ + ”)連接的單參數(shù)結(jié)構(gòu)。需要指出的是,具體如何利用常量部分、變量部分以及對(duì)應(yīng)關(guān)系標(biāo)識(shí)來構(gòu)造優(yōu)化日志方法,依據(jù)不同的語言規(guī)范可能有所不同,本發(fā)明的實(shí)施例僅以Java語言為例闡述本發(fā)明的構(gòu)思可以實(shí)現(xiàn),并不試圖對(duì)具體的構(gòu)造優(yōu)化日志的方法做出任何限制。接下來,在步驟410中,通過代碼注入將應(yīng)用程序中的原日志方法替換為所構(gòu)造的優(yōu)化日志方法。該步驟對(duì)應(yīng)于圖3中的步驟305,在此不再贅述。最后,在步驟411中,執(zhí)行優(yōu)化日志方法,以生成所述應(yīng)用程序的日志記錄。根據(jù)本發(fā)明的一個(gè)實(shí)施例,執(zhí)行優(yōu)化日志方法,以生成所述應(yīng)用程序的日志記錄包括將對(duì)應(yīng)于常量部分的日志信息及對(duì)應(yīng)關(guān)系標(biāo)識(shí)記錄在常量日志文件中,以及將對(duì)應(yīng)于變量部分的日志信息以及對(duì)應(yīng)關(guān)系標(biāo)識(shí)記錄在變量日志文件中。根據(jù)本發(fā)明的一個(gè)實(shí)施例,對(duì)應(yīng)于常量部分的日志信息僅被記錄一次,并且對(duì)應(yīng)于變量部分的日志信息在每次被觸發(fā)日志記錄時(shí)均被記錄。當(dāng)然,記錄的次數(shù)并非絕對(duì),本領(lǐng)域技術(shù)人員完全可以根據(jù)需要調(diào)整常量日志信息的記錄次數(shù),可能大于一次但是少于每次都記錄。本領(lǐng)域技術(shù)人員應(yīng)當(dāng)理解,即使不實(shí)際執(zhí)行所替換的優(yōu)化日志方法,本發(fā)明的發(fā)明目的也已實(shí)現(xiàn)一所構(gòu)造的日志方法本身的特點(diǎn)即可以保證減少日志記錄的IO操作、減少日志記錄對(duì)硬盤存儲(chǔ)空間的占用等。圖5示出了根據(jù)本發(fā)明一實(shí)施例的用于優(yōu)化應(yīng)用程序日志記錄的系統(tǒng)的框圖。圖5所示的系統(tǒng)在整體上由系統(tǒng)500表示,具體地系統(tǒng)500包括日志方法識(shí)別裝置501,被配置為識(shí)別應(yīng)用程序中的原日志方法;參數(shù)劃分裝置502,被配置為將所述原日志方法中的字符串參數(shù)分為常量部分和變量部分;標(biāo)識(shí)建立裝置503,被配置為建立所述常量部分和變量部分間的對(duì)應(yīng)關(guān)系標(biāo)識(shí);優(yōu)化日志方法構(gòu)造裝置504,被配置為利用所述常量部分、變量部分以及對(duì)應(yīng)關(guān)系標(biāo)識(shí),構(gòu)造優(yōu)化日志方法;日志方法替換裝置505,被配置為通過代碼注入,將所述應(yīng)用程序中的原日志方法替換為所述優(yōu)化日志方法。可以理解,系統(tǒng)500中的裝置501-505分別對(duì)應(yīng)于圖3所示的方法中的步驟301-305,在此不再贅述。圖7示出了根據(jù)本發(fā)明一實(shí)施例的程序日志系統(tǒng)的組成模塊圖。圖7的目的是為了與圖2示出的現(xiàn)有技術(shù)中的程序日志系統(tǒng)的組成模塊進(jìn)行對(duì)比,以更好地體現(xiàn)本發(fā)明的構(gòu)思及創(chuàng)新點(diǎn),但并非對(duì)本發(fā)明進(jìn)行任何限制。圖7示出的程序日志系統(tǒng)包括應(yīng)用程序701、優(yōu)化日志分析器702、實(shí)時(shí)運(yùn)行環(huán)境703、優(yōu)化日志方法704、常量日志705以及變量日志706。其中應(yīng)用程序701對(duì)應(yīng)于圖2中的應(yīng)用程序201,實(shí)時(shí)運(yùn)行環(huán)境703對(duì)應(yīng)于圖2中的應(yīng)用程序202,在此不再贅述。而優(yōu)化日志分析器702的作用是執(zhí)行圖3中的步驟301-305,因此優(yōu)化日志方法704替換了圖2中的原日志方法203。因此,利用優(yōu)化日志方法可以將常量參數(shù)存儲(chǔ)在常量日志705中,將變量參數(shù)存儲(chǔ)在變量日志706中。附圖中的流程圖和框圖,圖示了按照本發(fā)明各種實(shí)施例的系統(tǒng)、方法和計(jì)算機(jī)程序產(chǎn)品的可能實(shí)現(xiàn)的體系架構(gòu)、功能和操作。在這點(diǎn)上,流程圖或框圖中的每個(gè)方框可以代表一個(gè)模塊、程序段、或代碼的一部分,所述模塊、程序段、或代碼的一部分包含一個(gè)或多個(gè)用于實(shí)現(xiàn)規(guī)定的邏輯功能的可執(zhí)行指令。也應(yīng)當(dāng)注意,在有些作為替換的實(shí)現(xiàn)中,方框中所標(biāo)注的功能也可以以不同于附圖中所標(biāo)注的順序發(fā)生。例如,兩個(gè)接連地表示的方框?qū)嶋H上可以基本并行地執(zhí)行,它們有時(shí)也可以按相反的順序執(zhí)行,這依所涉及的功能而定。也要注意的是,框圖和/或流程圖中的每個(gè)方框、以及框圖和/或流程圖中的方框的組合,可以用執(zhí)行規(guī)定的功能或操作的專用的基于硬件的系統(tǒng)來實(shí)現(xiàn),或者可以用專用硬件與計(jì)算機(jī)指令的組合來實(shí)現(xiàn)。雖然以上結(jié)合具體實(shí)例,對(duì)本發(fā)明的利用遠(yuǎn)程應(yīng)用處理本地文件的系統(tǒng)及方法進(jìn)行了詳細(xì)描述,但本發(fā)明并不限于此。本領(lǐng)域普通技術(shù)人員能夠在說明書教導(dǎo)之下對(duì)本發(fā)明進(jìn)行多種變換、替換和修改而不偏離本發(fā)明的精神和范圍。應(yīng)該理解,所有這樣的變化、替換、修改仍然落入本發(fā)明的保護(hù)范圍之內(nèi)。本發(fā)明的保護(hù)范圍由所附權(quán)利要求來限定。
權(quán)利要求
1.一種用于優(yōu)化應(yīng)用程序日志記錄的方法,包括: 識(shí)別應(yīng)用程序中的原日志方法; 將所述原日志方法中的字符串參數(shù)分為常量部分和變量部分; 建立所述常量部分和變量部分間的對(duì)應(yīng)關(guān)系標(biāo)識(shí); 利用所述常量部分、變量部分以及所述對(duì)應(yīng)關(guān)系標(biāo)識(shí),構(gòu)造優(yōu)化日志方法; 通過代碼注入,將所述原日志方法替換為所述優(yōu)化日志方法。
2.按權(quán)利要求1所述的方法,其中利用所述常量部分、變量部分以及對(duì)應(yīng)關(guān)系標(biāo)識(shí),構(gòu)造優(yōu)化日志方法包括: 將所述對(duì)應(yīng)關(guān)系標(biāo)識(shí)分別加入所述常量部分和變量部分;以及 將含有所述對(duì)應(yīng)關(guān)系標(biāo)識(shí)的常量部分和變量部分合并,以構(gòu)造優(yōu)化日志方法。
3.按權(quán)利要求1或2所述的方法,其中將所述原日志方法中的字符串參數(shù)分為常量部分和變量部分包括: 響應(yīng)于原日志方法中用于創(chuàng)建字符串參數(shù)的指令為處理常量字符串的常量參數(shù)指令,確定所述指令所創(chuàng)建的字符串參數(shù)為常量部分;以及 響應(yīng)于原日志方法中用于創(chuàng)建字符串參數(shù)的指令為處理變量字符串的變量參數(shù)指令,確定所述指令所創(chuàng)建的字 符串參數(shù)為變量部分。
4.按權(quán)利要求3所述的方法,其中將所述原日志方法中的參數(shù)分為常量部分和變量部分進(jìn)一步包括: 定位所述原日志方法中用于創(chuàng)建字符串參數(shù)的指令;以及 檢索所述原日志方法中用于創(chuàng)建字符串參數(shù)的指令。
5.按權(quán)利要求1或2所述的方法,其中識(shí)別應(yīng)用程序中的原日志方法包括: 檢索所述應(yīng)用程序的目標(biāo)代碼;以及 在所述應(yīng)用程序的類中識(shí)別具有特定名稱且用于處理字符串參數(shù)的原日志方法。
6.按權(quán)利要求1所述的方法,進(jìn)一步包括: 利用所述優(yōu)化日志方法生成所述應(yīng)用程序的日志記錄。
7.按權(quán)利要求6所述的方法,其中利用所述優(yōu)化日志方法生成所述應(yīng)用程序的日志記錄包括: 將對(duì)應(yīng)于所述常量部分的日志信息以及所述對(duì)應(yīng)關(guān)系標(biāo)識(shí)記錄在常量日志文件中;以及 將對(duì)應(yīng)于所述變量部分的日志信息以及所述對(duì)應(yīng)關(guān)系標(biāo)識(shí)記錄在變量日志文件中。
8.按權(quán)利要求7所述的方法,其中所述對(duì)應(yīng)于常量部分的日志信息僅被記錄一次,并且所述對(duì)應(yīng)于變量部分的日志信息在每次被觸發(fā)時(shí)均被記錄。
9.一種用于優(yōu)化應(yīng)用程序日志記錄的系統(tǒng),包括: 日志方法識(shí)別裝置,被配置為識(shí)別應(yīng)用程序中的原日志方法; 參數(shù)劃分裝置,被配置為將所述原日志方法中的字符串參數(shù)分為常量部分和變量部分; 標(biāo)識(shí)建立裝置,被配置為建立所述常量部分和變量部分間的對(duì)應(yīng)關(guān)系標(biāo)識(shí); 優(yōu)化日志方法構(gòu)造裝置,被配置為利用所述常量部分、變量部分以及所述對(duì)應(yīng)關(guān)系標(biāo)識(shí),構(gòu)造優(yōu)化日志方法;以及日志方法替換裝置,被配置為通過代碼注入,將所述原日志方法替換為所述優(yōu)化日志方法。
10.按權(quán)利要求1所述的系統(tǒng),其中優(yōu)化日志方法構(gòu)造裝置被配置為: 將所述對(duì)應(yīng)關(guān)系標(biāo)識(shí)分別加入所述常量部分和變量部分;以及 將含有所述對(duì)應(yīng)關(guān)系標(biāo)識(shí)的常量部分和變量部分合并,以構(gòu)造優(yōu)化日志方法。
11.按權(quán)利要求9或10所述的系統(tǒng),其中參數(shù)劃分裝置被配置為: 響應(yīng)于原日志方法中用于創(chuàng)建字符串參數(shù)的指令為處理常量字符串的常量參數(shù)指令,確定所述指令所創(chuàng)建的字符串參數(shù)為常量部分;以及 響應(yīng)于原日志方法中用于創(chuàng)建字符串參數(shù)的指令為處理變量字符串的變量參數(shù)指令,確定所述指令所創(chuàng)建的字符串參數(shù)為變量部分。
12.按權(quán)利要求11所述的系統(tǒng),其中參數(shù)劃分裝置被進(jìn)一步配置為: 定位所述原日志方法中用于創(chuàng)建字符串參數(shù)的指令;以及 檢索所述原日志方法中用于創(chuàng)建字符串參數(shù)的指令。
13.按權(quán)利要求9或10所述的系統(tǒng),其中日志方法識(shí)別裝置被配置為: 檢索所述應(yīng)用程序的目標(biāo)代碼;以及 在應(yīng)用程序的類中識(shí)別具有特定名稱且用于處理字符串參數(shù)的原日志方法。
14.按權(quán)利要求9所述的系統(tǒng),進(jìn)一步包括: 日志記錄生成裝置,被配置為利用所述優(yōu)化日志方法生成所述應(yīng)用程序的日志記錄。
15.按權(quán)利要求14所述的系統(tǒng),其中日志記錄生成裝置被配置為: 將對(duì)應(yīng)于所述常量部分的日志信息以及所述對(duì)應(yīng)關(guān)系標(biāo)識(shí)記錄在常量日志文件中;以及 將對(duì)應(yīng)于所述變量部分的日志信息以及所述對(duì)應(yīng)關(guān)系標(biāo)識(shí)記錄在變量日志文件中。
16.按權(quán)利要求15所述的系統(tǒng), 其中所述對(duì)應(yīng)于常量部分的日志信息僅被記錄一次,并且所述對(duì)應(yīng)于變量部分的日志信息在每次被觸發(fā)時(shí)均被記錄。
全文摘要
本發(fā)明涉及應(yīng)用程序日志技術(shù)領(lǐng)域。更具體地,本發(fā)明尤其涉及通過將應(yīng)用程序中原有的日志方法進(jìn)行優(yōu)化并重新注入應(yīng)用程序的方法和系統(tǒng)。根據(jù)本發(fā)明的一個(gè)方面,提供了一種用于優(yōu)化應(yīng)用程序日志記錄的方法,包括識(shí)別應(yīng)用程序中的原日志方法;將所述原日志方法中的字符串參數(shù)分為常量部分和變量部分;建立所述常量部分和變量部分間的對(duì)應(yīng)關(guān)系標(biāo)識(shí);利用所述常量部分、變量部分以及對(duì)應(yīng)關(guān)系標(biāo)識(shí),構(gòu)造優(yōu)化日志方法;通過代碼注入,將所述應(yīng)用程序中的原日志方法替換為所述優(yōu)化日志方法。通過上述方法,可以減小日志記錄的硬盤存儲(chǔ)量以及IO操作頻率。
文檔編號(hào)G06F11/34GK103092742SQ20111033789
公開日2013年5月8日 申請(qǐng)日期2011年10月31日 優(yōu)先權(quán)日2011年10月31日
發(fā)明者羅志達(dá), 車漾, 王曄忻 申請(qǐng)人:國(guó)際商業(yè)機(jī)器公司