專利名稱:一種檢測未判斷日志輸出級別而直接輸出日志的方法
技術領域:
本發明涉及計算機技術,具體地說是一種檢測未判斷日志輸出級別而直接輸出日志的方法,用于檢測在j2ee軟件應用中使用了 Log4j的日志輸出功能卻未判斷日志輸出級別的問題。
背景技術:
Log4j是廣泛應用于j2ee應用的開源框架,用來輸出j2ee應用運行過程中產生的日志,如果使用不當將對系統性能造成影響,并發量高、大數量時甚至會導致宕機的情況。 具體應用錯誤的情況如下輸出日志時未先判斷日志輸出級別是否被允許輸出,當該級別不允許輸出時,在運行時,仍然會先構建傳入方法內的作為輸出內容的參數字符串,這個過程占用的CPU和內存資源是沒有價值的。現有技術中,僅能通過在運行環境中實際執行操作,然后再分析JVM內存的方式去發現使用Log4j框架時未判斷日志輸出級別而直接輸出日志的問題,這種方式由于需要部署運行環境并要實際執行操作,所以會消耗更多的成本和更多的時間。而且,對于操作未執行到的語句無法找出它的問題,對于內存消耗不明顯的語句也無法找出它的問題。
發明內容
本發明的技術任務是針對上述現有技術的不足,提供一種檢測周期短、成本低的檢測未判斷日志輸出級別而直接輸出日志的方法。本發明的技術任務是按以下方式實現的一種檢測未判斷日志輸出級別而直接輸出日志的方法,包括以下步驟
A、分析JAVA代碼的類文件,遍歷所有的命令代碼,找出使用了Log4j日志輸出級別判斷的命令;
B、分析JAVA代碼的類文件,遍歷所有的命令代碼,找出使用了Log4j框架輸出日志功能的命令,并判斷在調用前是否已經判斷了日志輸出級別。進一步的,該方法包括以下步驟
A、分析JAVA代碼的類文件,遍歷所有的命令代碼,找出使用了 Log4j日志輸出級別判斷的命令
打開JAVA代碼的類文件,逐條命令進行解析,找出Log4j日志輸出級別判斷的判定語句的語句塊范圍,
al、若命令的操作碼為IFEQ,說明該命令是一個判定語句,取得該命令的范圍,該范圍標明了判定語句開始執行的位置和結束的位置;
a2、若命令的操作碼為INVOKEVIRTUAL,且執行的方法名為isDebugEnabled或 islnfoEnab 1 ed或isEnabIedFor,說明該命令調用了 Log4 j的日志輸出級別判斷的功能,取得該命令所處的位置,判斷該命令是否處于判定語句塊內,如果判斷日志輸出級別的語句處于判定語句塊中,就記錄下判定語句塊的開始位置和結束位置;
a3、重復al和a2的過程,將該類文件中所有已經調用了 Log4j的日志輸出級別判斷的功能的判定語句塊找出并記錄語句塊的開始位置和結束位置;
B、分析JAVA代碼的類文件,遍歷所有的命令代碼,找出使用了 Log4j框架輸出日志功能的命令,并判斷在調用前是否已經判斷了日志輸出級別
打開JAVA代碼的類文件,逐條命令進行解析,若符合以下所有條件,判定該命令使用了 Log4j輸出日志的功能
該命令的操作碼為INVOKEVIRTUAL;
操作類的類名為 org. apache. Log4j. Logger;
執行的方法名為debug或info或error或fatal或warn;
如果判定結果為該命令使用了 Log4j輸出日志的功能,且該命令的位置大于A中記錄的判定語句塊的開始位置小于結束位置,則可認為它位于判定語句塊內,可判定該處的日志輸出已經提前進行了日志級別是否允許輸出的判定,否則,可判定此處存在使用Log4j 框架時未判斷日志輸出級別而直接輸出日志的錯誤用法。本發明的檢測未判斷日志輸出級別而直接輸出日志的方法與現有技術相比具有以下突出的有益效果
(一)該方法采用的是全新的靜態分析的方法,只需要源代碼編譯后的類文件,不需要運行環境,極大地降低了檢測成本;
(二)開發人員編寫完代碼就可以檢查他的代碼是否存在使用Log4j框架時未判斷日志輸出級別而直接輸出日志的問題,不需要發布到運行環境,也不需要人工去執行它,所以極大地降低了檢測周期;
(三)可對所有的java類文件進行檢測,檢測時遍歷了程序的所有命令,所以可以找出所有使用Log4j框架時未判斷日志輸出級別而直接輸出日志的問題;
(四)將該技術方案集成到FindBugs中,可以檢測出JAVA代碼中沒有判斷日志輸出級別而直接輸出日志的代碼,從而達到優化代碼,提高程序執行效率的目的。
具體實施例方式以具體實施例對本發明的檢測未判斷日志輸出級別而直接輸出日志的方法作以下詳細地說明。實施例
本發明的檢測未判斷日志輸出級別而直接輸出日志的方法通過分析JAVA代碼的類文件中的關鍵字,以及關鍵字所處的位置判斷Log4j框架是否使用錯誤。其具體步驟為
A、分析JAVA代碼的類文件,遍歷所有的命令代碼,找出使用了 Log4j日志輸出級別判斷的命令。打開JAVA代碼的類文件,逐條命令進行解析,找出Log4j日志輸出級別判斷的判定語句的語句塊范圍
al、若命令的操作碼為“IFEQ”(這是一個關鍵字,表示執行了一個判定命令),說明該命令是一個判定語句,取得該命令的范圍,該范圍標明了判定語句開始執行的位置和結束的位置;
a2、若命令的操作碼為“INVOKEVIRTUAL”(這是一個關鍵字,表示執行了一個動態綁定后調用的方法)而且執行的方法名為“ isDebugEnabled”、“ isInfoEnabled”、 “isEnabledForl以上為Log4j的方法名,作用為判斷指定的日志輸出級別是否允許輸出), 說明該命令調用了 Log4j的日志輸出級別判斷的功能,取得該命令所處的位置,判斷該命令是否處于判定語句塊內,如果判斷日志輸出級別的語句處于判定語句塊中,就記錄下判定語句塊的開始位置和結束位置;
a3、重復al和a2的過程,將該類文件中所有已經調用了 Log4j的日志輸出級別判斷的功能的判定語句塊找出并記錄語句塊的開始位置和結束位置。B、分析JAVA代碼的類文件,遍歷所有的命令代碼,找出使用了 Log4j框架輸出日志功能的命令,并判斷在調用前是否已經判斷了日志輸出級別。打開JAVA代碼的類文件,逐條命令進行解析,若符合以下所有條件,判定該命令使用了 Log4j輸出日志的功能該命令的操作碼為“INVOKEVIRTUAL”(這是一個關鍵字, 表示執行了一個動態綁定后調用的方法);操作類的類名為“org. apache. Log4j. Logger" (這是在Log4j中用于輸出日志的類的名稱);執行的方法名為“(1吐呢”、“11^0”、“吐1~01·”、 “fatal”、“Warn”(以上為Log4j中用于輸出日志的方法名)。如果判定結果為該命令使用了 Log4j輸出日志的功能,且該命令的位置大于之前記錄的判定語句塊的開始位置小于結束位置,則可認為它位于判定語句塊內,則可判定該處的日志輸出已經提前進行了日志級別是否允許輸出的判定,否則,則可判定此處存在使用Log4j框架時未判斷日志輸出級別而直接輸出日志的錯誤用法。
權利要求
1.一種檢測未判斷日志輸出級別而直接輸出日志的方法,其特征在于包括以下步驟A、分析JAVA代碼的類文件,遍歷所有的命令代碼,找出使用了Log4j日志輸出級別判斷的命令;B、分析JAVA代碼的類文件,遍歷所有的命令代碼,找出使用了Log4j框架輸出日志功能的命令,并判斷在調用前是否已經判斷了日志輸出級別。
2.根據權利要求1所述的檢測未判斷日志輸出級別而直接輸出日志的方法,其特征在于包括以下步驟A、分析JAVA代碼的類文件,遍歷所有的命令代碼,找出使用了Log4j日志輸出級別判斷的命令打開JAVA代碼的類文件,逐條命令進行解析,找出Log4j日志輸出級別判斷的判定語句的語句塊范圍,al、若命令的操作碼為IFEQ,說明該命令是一個判定語句,取得該命令的范圍,該范圍標明了判定語句開始執行的位置和結束的位置;a2、若命令的操作碼為INVOKEVIRTUAL,且執行的方法名為isDebugEnabled或 islnfoEnab 1 ed或isEnabIedFor,說明該命令調用了 Log4 j的日志輸出級別判斷的功能,取得該命令所處的位置,判斷該命令是否處于判定語句塊內,如果判斷日志輸出級別的語句處于判定語句塊中,就記錄下判定語句塊的開始位置和結束位置;a3、重復al和a2的過程,將該類文件中所有已經調用了 Log4j的日志輸出級別判斷的功能的判定語句塊找出并記錄語句塊的開始位置和結束位置;B、分析JAVA代碼的類文件,遍歷所有的命令代碼,找出使用了Log4j框架輸出日志功能的命令,并判斷在調用前是否已經判斷了日志輸出級別打開JAVA代碼的類文件,逐條命令進行解析,若符合以下所有條件,判定該命令使用了 Log4j輸出日志的功能該命令的操作碼為INVOKEVIRTUAL;操作類的類名為 org. apache. Log4j. Logger;執行的方法名為debug或info或error或fatal或warn;如果判定結果為該命令使用了 Log4j輸出日志的功能,且該命令的位置大于A中記錄的判定語句塊的開始位置小于結束位置,則可認為它位于判定語句塊內,可判定該處的日志輸出已經提前進行了日志級別是否允許輸出的判定,否則,可判定此處存在使用Log4j 框架時未判斷日志輸出級別而直接輸出日志的錯誤用法。
全文摘要
本發明公開了一種檢測未判斷日志輸出級別而直接輸出日志的方法,屬于計算機技術領域。該方法包括以下步驟A、分析JAVA代碼的類文件,遍歷所有的命令代碼,找出使用了Log4j日志輸出級別判斷的命令;B、分析JAVA代碼的類文件,遍歷所有的命令代碼,找出使用了Log4j框架輸出日志功能的命令,并判斷在調用前是否已經判斷了日志輸出級別。與現有技術相比,本發明的檢測未判斷日志輸出級別而直接輸出日志的方法具有檢測周期短、成本低等特點,具有很好的推廣應用價值。
文檔編號G06F11/36GK102508778SQ20111036208
公開日2012年6月20日 申請日期2011年11月16日 優先權日2011年11月16日
發明者夏雪, 闞寶麗 申請人:山東浪潮齊魯軟件產業股份有限公司