本發(fā)明涉及計(jì)算機(jī)技術(shù)領(lǐng)域,具體而言,涉及一種動(dòng)態(tài)日志記錄方法及裝置。
背景技術(shù):
在客戶端軟件的開發(fā)和維護(hù)過程中,經(jīng)常會(huì)遇到各種各樣的問題,開發(fā)人員需要依賴服務(wù)器端記錄的日志進(jìn)行軟件調(diào)試或排查生產(chǎn)環(huán)境的問題,服務(wù)器端記錄的日志通常包括客戶端發(fā)送的請(qǐng)求參數(shù)和服務(wù)器向客戶端發(fā)送的返回結(jié)果。
相關(guān)技術(shù)中通常利用過濾器或攔截器等技術(shù)在服務(wù)器端記錄日志,過濾器或攔截器可以看做服務(wù)器內(nèi)的應(yīng)用程序,過濾器或攔截器內(nèi)預(yù)先定義有需要記錄日志的類名稱和方法名稱,服務(wù)器在接收到客戶端發(fā)送的業(yè)務(wù)請(qǐng)求后,根據(jù)過濾器或攔截器內(nèi)預(yù)先定義的類名稱和方法名稱記錄對(duì)應(yīng)類和方法的請(qǐng)求參數(shù)和返回結(jié)果,得到日志。
然而,通過過濾器或者攔截器的方式記錄日志時(shí),只能在過濾器或者攔截器的編譯期間指定記錄某種類和方法的日志,如果需要對(duì)某個(gè)類和方法新增日志記錄功能,需要重新編譯過濾器或攔截器,并重啟服務(wù)器。對(duì)于生產(chǎn)環(huán)境,重啟服務(wù)器會(huì)對(duì)線上功能產(chǎn)生影響,容易破壞現(xiàn)場(chǎng),不利于問題的復(fù)現(xiàn)和排查;對(duì)于開發(fā)過程,重啟服務(wù)器將增長(zhǎng)軟件調(diào)試過程,降低軟件開發(fā)和調(diào)試效率。
針對(duì)上述提到的對(duì)某個(gè)類和方法新增日志記錄功能時(shí),需要重啟服務(wù)器,從而影響生產(chǎn)環(huán)境、破壞問題現(xiàn)場(chǎng),并使得軟件調(diào)試過程變長(zhǎng),降低軟件開發(fā)和調(diào)試效率,尚未提出很好的解決方案。
技術(shù)實(shí)現(xiàn)要素:
有鑒于此,本發(fā)明的目的在于提供一種動(dòng)態(tài)日志記錄方法及裝置,以解決相關(guān)技術(shù)中對(duì)某個(gè)類和方法新增日志記錄功能時(shí),需要重啟服務(wù)器,從而影響生產(chǎn)環(huán)境、破壞問題現(xiàn)場(chǎng),并使得軟件調(diào)試過程變長(zhǎng),降低軟件開發(fā)和調(diào)試效率的問題。
第一方面,本發(fā)明實(shí)施例提供了一種動(dòng)態(tài)日志記錄方法,所述方法包括:獲取日志記錄請(qǐng)求,所述日志記錄請(qǐng)求包括與日志記錄相關(guān)的類的標(biāo)識(shí)、所述類的日志記錄內(nèi)容的標(biāo)識(shí)、所述類的日志記錄方式的標(biāo)識(shí);當(dāng)所述類的日志記錄方式為開始記錄所述類的日志時(shí),為所述類建立代理類,通過所述代理類按照所述類的日志記錄內(nèi)容記錄所述類的日志,其中,所述代理類具有日志記錄功能。
結(jié)合第一方面,本發(fā)明實(shí)施例提供了第一方面第一種可能的實(shí)施方式,其中,所述為所述類建立代理類包括:采用動(dòng)態(tài)生成類的方式生成所述代理類,所述代理類持有所述類的引用,所述代理類中的方法與所述類中的方法一一對(duì)應(yīng)。
結(jié)合第一方面,本發(fā)明實(shí)施例提供了第一方面第二種可能的實(shí)施方式,其中,所述通過所述代理類按照所述類的日志記錄內(nèi)容記錄所述類的日志包括:在接收到所述類的業(yè)務(wù)請(qǐng)求時(shí),確定所述類中執(zhí)行所述業(yè)務(wù)請(qǐng)求的方法為第一方法,確定所述代理類中與所述第一方法對(duì)應(yīng)的方法為第二方法;在所述類的日志記錄內(nèi)容包括所述第一方法對(duì)應(yīng)的日志記錄內(nèi)容時(shí),通過所述第二方法調(diào)用所述第一方法執(zhí)行所述業(yè)務(wù)請(qǐng)求,并通過所述第二方法按照所述第一方法對(duì)應(yīng)的日志記錄內(nèi)容記錄所述類的日志,其中,所述第一方法對(duì)應(yīng)的日志記錄內(nèi)容包括所述第一方法在執(zhí)行所述業(yè)務(wù)請(qǐng)求時(shí)的請(qǐng)求參數(shù)和/或執(zhí)行結(jié)果。
結(jié)合第一方面,本發(fā)明實(shí)施例提供了第一方面第三種可能的實(shí)施方式,其中,所述方法還包括:當(dāng)所述類的日志記錄方式為暫停記錄所述類的日志時(shí),暫停通過所述代理類按照所述類的日志記錄內(nèi)容記錄所述類的日志。
結(jié)合第一方面上述的實(shí)施方式,本發(fā)明實(shí)施例提供了第一方面第四種可能的實(shí)施方式,其中,所述方法還包括:當(dāng)所述類的日志記錄方式為結(jié)束記錄所述類的日志時(shí),刪除所述類的代理類,以結(jié)束通過所述代理類記錄所述類的日志。
第二方面,本發(fā)明實(shí)施例提供了一種動(dòng)態(tài)日志記錄裝置,所述裝置包括:獲取模塊,用于獲取日志記錄請(qǐng)求,所述日志記錄請(qǐng)求包括與日志記錄相關(guān)的類的標(biāo)識(shí)、所述類的日志記錄內(nèi)容的標(biāo)識(shí)、所述類的日志記錄方式的標(biāo)識(shí);日志記錄模塊,用于當(dāng)所述類的日志記錄方式為開始記錄所述類的日志時(shí),為所述類建立代理類,通過所述代理類按照所述類的日志記錄內(nèi)容記錄所述類的日志,其中,所述代理類具有日志記錄功能。
結(jié)合第二方面,本發(fā)明實(shí)施例提供了第二方面第一種可能的實(shí)施方式,其中,所述日志記錄模塊包括:生成子模塊,用于采用動(dòng)態(tài)生成類的方式生成所述代理類,所述代理類持有所述類的引用,所述代理類中的方法與所述類中的方法一一對(duì)應(yīng)。
結(jié)合第二方面,本發(fā)明實(shí)施例提供了第二方面第二種可能的實(shí)施方式,其中,所述日志記錄模塊包括:確定子模塊,用于在接收到所述類的業(yè)務(wù)請(qǐng)求時(shí),確定所述類中執(zhí)行所述業(yè)務(wù)請(qǐng)求的方法為第一方法,確定所述代理類中與所述第一方法對(duì)應(yīng)的方法為第二方法;記錄子模塊,用于在所述類的日志記錄內(nèi)容包括所述第一方法對(duì)應(yīng)的日志記錄內(nèi)容時(shí),通過所述第二方法調(diào)用所述第一方法執(zhí)行所述業(yè)務(wù)請(qǐng)求,并通過所述第二方法按照所述第一方法對(duì)應(yīng)的日志記錄內(nèi)容記錄所述類的日志,其中,所述第一方法對(duì)應(yīng)的日志記錄內(nèi)容包括所述第一方法在執(zhí)行所述業(yè)務(wù)請(qǐng)求時(shí)的請(qǐng)求參數(shù)和/或執(zhí)行結(jié)果。
結(jié)合第二方面,本發(fā)明實(shí)施例提供了第二方面第三種可能的實(shí)施方式,其中,所述裝置還包括:暫停日志記錄模塊,用于當(dāng)所述類的日志記錄方式為暫停記錄所述類的日志時(shí),暫停通過所述代理類按照所述類的日志記錄內(nèi)容記錄所述類的日志。
結(jié)合第二方面上述的實(shí)施方式,本發(fā)明實(shí)施例提供了第二方面第四種可能的實(shí)施方式,其中,所述裝置還包括:結(jié)束日志記錄模塊,用于當(dāng)所述類的日志記錄方式為結(jié)束記錄所述類的日志時(shí),刪除所述類的代理類,以結(jié)束通過所述代理類記錄所述類的日志。
本發(fā)明實(shí)施例中的方法及裝置,當(dāng)需要記錄某類的日志時(shí),為該類建立代理類,通過代理類記錄該類的日志。由于生成代理類的過程不需要重啟服務(wù)器,因此通過本發(fā)明實(shí)施例中的方法及裝置在記錄某個(gè)類的日志時(shí),無需重啟服務(wù)器,能夠?qū)崿F(xiàn)日志的靈活記錄,可在不對(duì)生成環(huán)境產(chǎn)生任何影響的前提下動(dòng)態(tài)記錄指定方法的日志,并可縮短軟件調(diào)試過程,提高軟件開發(fā)和調(diào)試效率,解決相關(guān)技術(shù)中對(duì)某個(gè)類和方法新增日志記錄功能時(shí),需要重啟服務(wù)器,從而影響生產(chǎn)環(huán)境、破壞問題現(xiàn)場(chǎng),并使得軟件調(diào)試過程變長(zhǎng),降低軟件開發(fā)和調(diào)試效率的問題。
為使本發(fā)明的上述目的、特征和優(yōu)點(diǎn)能更明顯易懂,下文特舉較佳實(shí)施例,并配合所附附圖,作詳細(xì)說明如下。
附圖說明
為了更清楚地說明本發(fā)明實(shí)施例的技術(shù)方案,下面將對(duì)實(shí)施例中所需要使用的附圖作簡(jiǎn)單地介紹,應(yīng)當(dāng)理解,以下附圖僅示出了本發(fā)明的某些實(shí)施例,因此不應(yīng)被看作是對(duì)范圍的限定,對(duì)于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動(dòng)的前提下,還可以根據(jù)這些附圖獲得其他相關(guān)的附圖。
圖1為本發(fā)明第一實(shí)施例中動(dòng)態(tài)日志記錄方法及裝置的應(yīng)用環(huán)境示意圖;
圖2為本發(fā)明第一實(shí)施例中動(dòng)態(tài)日志記錄方法的第一種流程示意圖;
圖3為本發(fā)明第一實(shí)施例中動(dòng)態(tài)日志記錄方法的第二種流程示意圖;
圖4為本發(fā)明第二實(shí)施例中Spring Framework框架、代理類、代理類對(duì)應(yīng)的類之間的依賴關(guān)系示意圖;
圖5為本發(fā)明第三實(shí)施例中動(dòng)態(tài)日志記錄裝置的模塊組成示意圖。
具體實(shí)施方式
為使本發(fā)明實(shí)施例的目的、技術(shù)方案和優(yōu)點(diǎn)更加清楚,下面將結(jié)合本發(fā)明實(shí)施例中附圖,對(duì)本發(fā)明實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實(shí)施例僅僅是本發(fā)明一部分實(shí)施例,而不是全部的實(shí)施例。通常在此處附圖中描述和示出的本發(fā)明實(shí)施例的組件可以以各種不同的配置來布置和設(shè)計(jì)。因此,以下對(duì)在附圖中提供的本發(fā)明的實(shí)施例的詳細(xì)描述并非旨在限制要求保護(hù)的本發(fā)明的范圍,而是僅僅表示本發(fā)明的選定實(shí)施例。基于本發(fā)明的實(shí)施例,本領(lǐng)域技術(shù)人員在沒有做出創(chuàng)造性勞動(dòng)的前提下所獲得的所有其他實(shí)施例,都屬于本發(fā)明保護(hù)的范圍。
考慮到相關(guān)技術(shù)中對(duì)某個(gè)類和方法新增日志記錄功能時(shí),需要重啟服務(wù)器,從而影響生產(chǎn)環(huán)境、破壞問題現(xiàn)場(chǎng),并使得軟件調(diào)試過程變長(zhǎng),降低軟件開發(fā)和調(diào)試效率的問題,本發(fā)明提供了一種動(dòng)態(tài)日志記錄方法及裝置,下面結(jié)合實(shí)施例進(jìn)行具體描述。
為了更加清楚的介紹本發(fā)明提供的動(dòng)態(tài)日志記錄方法及裝置,下面首先介紹本發(fā)明提供的動(dòng)態(tài)日志記錄方法及裝置的應(yīng)用環(huán)境,圖1為本發(fā)明實(shí)施例中動(dòng)態(tài)日志記錄方法及裝置的應(yīng)用環(huán)境示意圖,如圖1所示,本發(fā)明實(shí)施例中的應(yīng)用環(huán)境包括客戶端1和服務(wù)器2,本實(shí)施例中的動(dòng)態(tài)日志記錄方法及裝置應(yīng)用在服務(wù)器側(cè)。在軟件開發(fā)過程中,客戶端1不斷向服務(wù)器2發(fā)送業(yè)務(wù)請(qǐng)求,服務(wù)器2執(zhí)行該業(yè)務(wù)請(qǐng)求,并向客戶端1返回執(zhí)行結(jié)果。為了便于軟件調(diào)試,服務(wù)器2會(huì)進(jìn)行日志記錄,服務(wù)器2記錄的日志包括客戶端1發(fā)送的某個(gè)類的某個(gè)方法的請(qǐng)求參數(shù)(也稱入?yún)?,和/或,服務(wù)器2執(zhí)行該類的該方法后向客戶端1返回的執(zhí)行結(jié)果。其中,客戶端1向服務(wù)器2發(fā)送的業(yè)務(wù)請(qǐng)求在代碼層表現(xiàn)為某個(gè)類的某個(gè)方法的請(qǐng)求參數(shù)。
實(shí)施例一
本發(fā)明第一實(shí)施例提供了一種動(dòng)態(tài)日志記錄方法,圖2為本發(fā)明實(shí)施例中動(dòng)態(tài)日志記錄方法的第一種流程示意圖,該方法由圖1中的服務(wù)器執(zhí)行,如圖2所示,本發(fā)明實(shí)施例中的動(dòng)態(tài)日志記錄方法包括以下步驟:
步驟S202,獲取日志記錄請(qǐng)求,該日志記錄請(qǐng)求包括與日志記錄相關(guān)的類的標(biāo)識(shí)、該類的日志記錄內(nèi)容的標(biāo)識(shí)、該類的日志記錄方式的標(biāo)識(shí)。
本步驟中,服務(wù)器獲取日志記錄請(qǐng)求,該日志記錄請(qǐng)求可以由客戶端發(fā)送,也可以由開發(fā)人員直接輸入至服務(wù)器。該日志記錄請(qǐng)求包括與日志記錄相關(guān)的類的標(biāo)識(shí)、該類的日志記錄內(nèi)容的標(biāo)識(shí)、該類的日志記錄方式的標(biāo)識(shí),其中,與日志記錄相關(guān)的類可以為需要記錄日志的類、暫停記錄日志的類或者結(jié)束記錄日志的類,該類的日志記錄內(nèi)容的標(biāo)識(shí)用來表示該類需要記錄的日志的內(nèi)容、或者需要暫停記錄的日志的內(nèi)容,這里的內(nèi)容包括入?yún)⒑?或返回結(jié)果,該類的日志記錄方式的標(biāo)識(shí)用來表示該類是需要開始記錄日志,還是暫停/結(jié)束記錄日志,對(duì)應(yīng)地,該類的日志記錄方式包括開始記錄該類的日志、暫停/結(jié)束記錄該類的日志。
本實(shí)施例中,日志記錄請(qǐng)求還可以包括該類的方法的標(biāo)識(shí),當(dāng)日志記錄請(qǐng)求不包括該類的方法的標(biāo)識(shí)時(shí),表明該類中的所有方法都需要記錄日志,當(dāng)日志記錄請(qǐng)求包括該類的方法的標(biāo)識(shí)時(shí),該方法的標(biāo)識(shí)對(duì)應(yīng)的方法需要記錄日志,其余的方法不需要記錄日志,該種情況下,上述該類的日志記錄內(nèi)容的標(biāo)識(shí)可以指定記錄/暫停記錄該類中哪個(gè)方法的入?yún)⒑?或返回結(jié)果。
本發(fā)明實(shí)施例提供了日志記錄請(qǐng)求的一種具體示例,該日志記錄請(qǐng)求為URL(Uniform Resoure Locator,統(tǒng)一資源定位符)格式,比如,http://{domain}//dynamicLogger/config.do?class={class}&method={method}&action={action}&type={type},該URL中,{domain}表示web服務(wù)器的域名;{class}表示與日志記錄相關(guān)的類的標(biāo)識(shí),該參數(shù)為不可缺少的必要參數(shù);{method}表示與日志記錄相關(guān)的類中的具體方法的標(biāo)識(shí),當(dāng)該參數(shù)為空時(shí),表示上述類中所有的方法都與日志記錄有關(guān),當(dāng)該參數(shù)不為空時(shí),該參數(shù)所指定的方法為與日志記錄有關(guān)的方法,其沒有指定的方法與日志記錄無關(guān),這里與日志記錄相關(guān)的方法可以為需要記錄日志的方法、暫停記錄日志的方法或者結(jié)束記錄日志的方法;{action}表示類的日志記錄方式的標(biāo)識(shí),取值有add,表示新增日志記錄,stop,表示暫停日志記錄,delete,表示結(jié)束日志記錄,{action}的默認(rèn)取值通常為add;{type}表示類的日志記錄內(nèi)容的標(biāo)識(shí),取值有param,表示記錄該類中需要記錄的方法的入?yún)?,即客戶端傳輸?shù)恼?qǐng)求參數(shù),result,表示記錄該類中需要記錄的方法的執(zhí)行結(jié)果,既服務(wù)器返回給客戶端的執(zhí)行結(jié)果,all,表示記錄該類中需要記錄的方法的入?yún)⒑蛨?zhí)行結(jié)果。
步驟S204,當(dāng)上述類的日志記錄方式為開始記錄該類的日志時(shí),為該類建立代理類,通過代理類按照該類的日志記錄內(nèi)容記錄該類的日志,其中,代理類具有日志記錄功能。
由于服務(wù)器在獲取到日志記錄請(qǐng)求后才知道需要記錄哪個(gè)類哪個(gè)方法的日志,以及需要記錄什么內(nèi)容,因此為了實(shí)現(xiàn)靈活的日志記錄功能,本實(shí)施例中通過代理類的方式記錄日志。當(dāng)日志記錄請(qǐng)求中表明日志記錄方式為開始記錄該類的日志時(shí),服務(wù)器為該類建立代理類,該類就是步驟S202中的與日志記錄相關(guān)的類,服務(wù)器通過代理類按照該類的日志記錄內(nèi)容記錄該類的日志。
服務(wù)器為該類建立代理類的具體過稱為:服務(wù)器采用動(dòng)態(tài)生成類的方式生成代理類,代理類持有該類的引用,代理類中的方法與該類中的方法一一對(duì)應(yīng)。舉例而言,服務(wù)器為類A建立代理類,類A包括A1、A2、A3三個(gè)方法,則服務(wù)器采用動(dòng)態(tài)生成類的方式生成代理類B,代理類B持有類A的引用,代理類B中的方法為B1、B2、B3,依次與A1、A2、A3相對(duì)應(yīng)。
本實(shí)施例中,當(dāng)某類需要記錄日志時(shí),為該類建立代理類,代理類的作用包括兩個(gè)方面,第一方面是記錄該類的日志,另一方面是調(diào)用該類執(zhí)行業(yè)務(wù)請(qǐng)求。
服務(wù)器在為該類建立代理類之后,還通過代理類按照該類的日志記錄內(nèi)容記錄該類的日志,其具體過程為:
(1)在接收到該類的業(yè)務(wù)請(qǐng)求時(shí),確定該類中執(zhí)行業(yè)務(wù)請(qǐng)求的方法為第一方法,確定代理類中與第一方法對(duì)應(yīng)的方法為第二方法;
(2)在該類的日志記錄內(nèi)容包括第一方法對(duì)應(yīng)的日志記錄內(nèi)容時(shí),通過第二方法調(diào)用第一方法執(zhí)行業(yè)務(wù)請(qǐng)求,并通過第二方法按照第一方法對(duì)應(yīng)的日志記錄內(nèi)容記錄該類的日志,其中,第一方法對(duì)應(yīng)的日志記錄內(nèi)容包括第一方法在執(zhí)行業(yè)務(wù)請(qǐng)求時(shí)的請(qǐng)求參數(shù)和/或執(zhí)行結(jié)果。
具體地,服務(wù)器在接收到該類的業(yè)務(wù)請(qǐng)求時(shí),確定該類中執(zhí)行業(yè)務(wù)請(qǐng)求的方法為第一方法,確定代理類中與第一方法對(duì)應(yīng)的方法為第二方法,服務(wù)器判斷該類的日志記錄內(nèi)容是否包括第一方法對(duì)應(yīng)的日志記錄內(nèi)容,也即在記錄該類的日志時(shí)是否記錄第一方法對(duì)應(yīng)的日志,如果是,則服務(wù)器通過第二方法調(diào)用第一方法執(zhí)行業(yè)務(wù)請(qǐng)求,第一方法執(zhí)行業(yè)務(wù)請(qǐng)求的返回結(jié)果通過第二方法返回給客戶端,服務(wù)器還通過第二方法記錄第一方法對(duì)應(yīng)的日志內(nèi)容,其中,第一方法對(duì)應(yīng)的日志內(nèi)容包括第一方法在執(zhí)行業(yè)務(wù)請(qǐng)求時(shí)客戶端發(fā)送的請(qǐng)求參數(shù),和/或,第一方法執(zhí)行業(yè)務(wù)請(qǐng)求的執(zhí)行結(jié)果。
本發(fā)明實(shí)施例中的方法,當(dāng)需要記錄某類的日志時(shí),為該類建立代理類,通過代理類記錄該類的日志。由于生成代理類的過程不需要重啟服務(wù)器,因此通過本發(fā)明實(shí)施例中的方法在記錄某個(gè)類的日志時(shí),無需重啟服務(wù)器,能夠?qū)崿F(xiàn)日志的靈活記錄,可在不對(duì)生成環(huán)境產(chǎn)生任何影響的前提下動(dòng)態(tài)記錄指定方法的日志,并可縮短軟件調(diào)試過程,提高軟件開發(fā)和調(diào)試效率,解決相關(guān)技術(shù)中對(duì)某個(gè)類和方法新增日志記錄功能時(shí),需要重啟服務(wù)器,從而影響生產(chǎn)環(huán)境、破壞問題現(xiàn)場(chǎng),并使得軟件調(diào)試過程變長(zhǎng),降低軟件開發(fā)和調(diào)試效率的問題。
圖3為本發(fā)明實(shí)施例中動(dòng)態(tài)日志記錄方法的第二種流程示意圖,如圖3所示,本實(shí)施例中的方法還包括以下步驟:
步驟S206,當(dāng)上述類的日志記錄方式為暫停記錄該類的日志時(shí),暫停通過代理類按照該類的日志記錄內(nèi)容記錄該類的日志。
具體地,當(dāng)日志記錄請(qǐng)求中的日志記錄方式為暫停記錄該類的日志時(shí),說明該類之前建立過代理類,并通過代理類記錄過日志,則服務(wù)器暫停通過代理類按照該類的日志記錄內(nèi)容記錄該類的日志。
一種實(shí)施方式中,日志記錄請(qǐng)求不包括該類中具體方法的標(biāo)識(shí),日志記錄方式為暫停記錄該類的日志,則服務(wù)器暫停通過代理類記錄該類的所有方法的日志,另一種實(shí)施方式中,日志記錄請(qǐng)求包括該類中具體方法的標(biāo)識(shí),日志記錄方式為暫停記錄該類的日志,則服務(wù)器暫停通過代理類記錄該方法的日志,暫停的內(nèi)容與日志記錄請(qǐng)求中的日志記錄內(nèi)容一致。
步驟S208,當(dāng)上述類的日志記錄方式為結(jié)束記錄該類的日志時(shí),刪除該類的代理類,以結(jié)束通過代理類記錄該類的日志。
具體地,當(dāng)日志記錄請(qǐng)求中的日志記錄方式為結(jié)束記錄該類的日志時(shí),說明該類之前建立過代理類,并通過代理類記錄過日志,則服務(wù)器刪除該類的代理類,以結(jié)束通過代理類記錄該類的日志。
通過本發(fā)明實(shí)施例中的方法,不僅能夠開始記錄某個(gè)類某個(gè)方法的日志,還能夠暫停記錄某個(gè)類某個(gè)方法的日志,或者結(jié)束記錄某個(gè)類的日志,因此能夠?qū)崿F(xiàn)日志的靈活記錄,滿足軟件調(diào)試過程中遇到的各種情況。
通過本發(fā)明實(shí)施例中的方法,動(dòng)態(tài)的指定需要記錄日志的類和方法,無需重啟服務(wù)器,可以直接記錄日志。對(duì)于開發(fā)過程,避免了編譯、部署、重啟服務(wù)器的過程,縮短了調(diào)試流程,可以很好的提高程序開發(fā)和調(diào)試的效率。對(duì)于生產(chǎn)環(huán)境而言,可以在不重啟服務(wù)器的情況,啟動(dòng)、暫?;蚪Y(jié)束記錄日志,一方面不會(huì)影響線上功能,另一方面也可以保護(hù)好問題發(fā)生時(shí)的現(xiàn)場(chǎng),有利于問題的復(fù)現(xiàn)和排查,最后,本實(shí)施例中的方法無需一開始就記錄過多的日志,可以根據(jù)需要?jiǎng)討B(tài)的啟動(dòng)、暫?;蚪Y(jié)束記錄日志,在一定程度上提高了系統(tǒng)性能。本實(shí)施例中的方法對(duì)服務(wù)器的原始系統(tǒng)和功能沒有侵入性,對(duì)服務(wù)器性能不產(chǎn)生任何影響。
實(shí)施例二
為了更清楚的說明實(shí)施例一中的方法,本發(fā)明第二實(shí)施例給出了一種具體的實(shí)施過程,該實(shí)施過程基于Spring Framework框架實(shí)現(xiàn),本實(shí)施方式中,預(yù)先編寫有日志記錄插件,該日志記錄插件具有接收日志記錄請(qǐng)求、建立代理類、開始記錄日志、暫停記錄日志或者結(jié)束記錄日志的功能,將該日志記錄插件植入Spring Framework框架,就能夠在服務(wù)器端進(jìn)行靈活的日志記錄。
該日志記錄插件具有以下功能模塊:
(1)LogRequest日志請(qǐng)求模塊,用于接收日志記錄請(qǐng)求,日志記錄請(qǐng)求可以為前述的URL形式;
(2)LogRequestCache緩存模塊,用于緩存各個(gè)需要記錄日志的類與各自的代理類之間的映射關(guān)系,通過LogRequestCache緩存模塊存儲(chǔ)已經(jīng)生成過的代理類,能夠提高服務(wù)器系統(tǒng)的性能,對(duì)于已經(jīng)生成過代理類的類,無需重新生成,并且方便后續(xù)對(duì)于動(dòng)態(tài)日志的取消;
(3)CustomClassLoaderManager日志記錄模塊,用于判斷日志記錄請(qǐng)求中的日志記錄方式,當(dāng)日記記錄方式為開始記錄類的日志時(shí),若LogRequestCache中已經(jīng)包含代理類,則直接調(diào)用該代理類進(jìn)行日志記錄,若LogRequestCache中不包含代理類,則為需要記錄日志的類生成代理類,并配置Spring Framework框架、該代理類、該類之間的代理關(guān)系;當(dāng)日記記錄方式為暫停記錄類的日志時(shí),取消該被暫停的類的代理類的日志記錄流程;當(dāng)日志記錄方式為結(jié)束記錄類的日志時(shí),刪除該被結(jié)束的類的代理類,并重置Spring Framework框架和該類之間的關(guān)系;
(4)CustomClassLoader自定義加載模塊,當(dāng)需要生成動(dòng)態(tài)代理類時(shí),該CustomClassLoader自定義加載模塊調(diào)用JavassistHelper類,修改原類的字節(jié)碼工程,生成一個(gè)新的字節(jié)碼類,然后將生成的代理類加載到JVM當(dāng)中,當(dāng)要?jiǎng)h除動(dòng)態(tài)代理類時(shí),也由該模塊來銷毀代理類;
(5)DynamicLoggerProxy動(dòng)態(tài)日志代理模塊,該模塊由JavassistHelper動(dòng)態(tài)生成,該模塊直接繼承自需要記錄日志的類,其方法與被繼承類中的方法一一對(duì)應(yīng),其作用是負(fù)責(zé)對(duì)應(yīng)的方法的調(diào)用;
(6)LogMethodCreator日志方法生成模塊,該模塊是DynamicLoggerProxy動(dòng)態(tài)日志代理模塊中方法的生成器,用于生成具體的代理方法,根據(jù)日志記錄請(qǐng)求記錄不同的日志,代理類中的各個(gè)方法還需要調(diào)用對(duì)應(yīng)的類中的方法執(zhí)行業(yè)務(wù)請(qǐng)求。
圖4為本發(fā)明實(shí)施例中Spring Framework框架、代理類、代理類對(duì)應(yīng)的類(與日志記錄相關(guān)的類,亦稱為業(yè)務(wù)類)之間的依賴關(guān)系示意圖,如圖4所示,對(duì)于客戶端發(fā)送的業(yè)務(wù)請(qǐng)求,Spring Framework框架將該業(yè)務(wù)請(qǐng)求發(fā)送至代理類,代理類調(diào)用對(duì)應(yīng)的業(yè)務(wù)類執(zhí)行該業(yè)務(wù)請(qǐng)求,業(yè)務(wù)類將執(zhí)行結(jié)果返回給代理類,再由代理類將執(zhí)行結(jié)果通過Spring Framework框架返回給客戶端。
下面介紹上述日志記錄插件植入Spring Framework框架的過程。
(1)引入Jar包:如果要使用日志記錄插件,必須引入日志記錄插件的jar(spring-dynamic-log-1.0.0.jar)包,該jar包包含了日志記錄插件的全部實(shí)現(xiàn)源碼;
(2)引入配置文件:1.1步驟(1)中引入的jar包中包含了spring-dynimic-log-config.xml配置文件,需要在Spring的配置文件(applicationContext.xml)中引入該配置文件,形式如下:
<import resource="spring-dynimic-log-config.xml"/>;
(3)配置入口:1.1該入口的作用是為了動(dòng)態(tài)的指定需要記錄日志的類和方法。本實(shí)施例中日志記錄插件提供一種默認(rèn)的實(shí)現(xiàn)方式,可以通過配置servlet來實(shí)現(xiàn)。其形式如下:
(4)指定日志記錄請(qǐng)求該日志記錄請(qǐng)求為URL(Uniform Resoure Locator,統(tǒng)一資源定位符)格式,比如,http://{domain}//dynamicLogger/config.do?class={class}&method={method}&action={action}&type={type},該URL中,
{domain}表示web服務(wù)器的域名;
{class}表示與日志記錄相關(guān)的類的標(biāo)識(shí),該參數(shù)為不可缺少的必要參數(shù);
{method}表示與日志記錄相關(guān)的類中的具體方法的標(biāo)識(shí),當(dāng)該參數(shù)為空時(shí),表示上述類中所有的方法都與日志記錄有關(guān),當(dāng)該參數(shù)不為空時(shí),該參數(shù)所指定的方法為與日志記錄有關(guān)的方法,其沒有指定的方法與日志記錄無關(guān),這里與日志記錄相關(guān)的方法可以為需要記錄日志的方法、暫停記錄日志的方法或者結(jié)束記錄日志的方法;
{action}表示類的日志記錄方式的標(biāo)識(shí),取值有add,表示新增日志記錄,stop,表示暫停日志記錄,delete,表示結(jié)束日志記錄,{action}的默認(rèn)取值通常為add;
{type}表示類的日志記錄內(nèi)容的標(biāo)識(shí),取值有param,表示記錄該類中需要記錄的方法的入?yún)?,即客戶端傳輸?shù)恼?qǐng)求參數(shù),result,表示記錄該類中需要記錄的方法的執(zhí)行結(jié)果,既服務(wù)器返回給客戶端的執(zhí)行結(jié)果,all,表示記錄該類中需要記錄的方法的入?yún)⒑蛨?zhí)行結(jié)果。
通過本發(fā)明實(shí)施例中的日志記錄插件,動(dòng)態(tài)的指定需要記錄日志的類和方法,無需重啟服務(wù)器,可以直接記錄日志。對(duì)于開發(fā)過程,避免了編譯、部署、重啟服務(wù)器的過程,縮短了調(diào)試流程,可以很好的提高程序開發(fā)和調(diào)試的效率。對(duì)于生產(chǎn)環(huán)境而言,可以在不重啟服務(wù)器的情況,啟動(dòng)、暫?;蚪Y(jié)束記錄日志,一方面不會(huì)影響線上功能,另一方面也可以保護(hù)好問題發(fā)生時(shí)的現(xiàn)場(chǎng),有利于問題的復(fù)現(xiàn)和排查,最后,本實(shí)施例中的日志記錄插件無需一開始就記錄過多的日志,可以根據(jù)需要?jiǎng)討B(tài)的啟動(dòng)、暫停或結(jié)束記錄日志,在一定程度上提高了系統(tǒng)性能。本實(shí)施例中的日志記錄插件對(duì)服務(wù)器的原始系統(tǒng)和功能沒有侵入性,對(duì)服務(wù)器性能不產(chǎn)生任何影響。
實(shí)施例三
與實(shí)施例一中的方法對(duì)應(yīng),本發(fā)明第三實(shí)施例提供了一種動(dòng)態(tài)日志記錄裝置,該裝置應(yīng)用與服務(wù)器端,圖5為本發(fā)明第三實(shí)施例中動(dòng)態(tài)日志記錄裝置的模塊組成示意圖,如圖5所示,該裝置包括:
獲取模塊51,用于獲取日志記錄請(qǐng)求,所述日志記錄請(qǐng)求包括與日志記錄相關(guān)的類的標(biāo)識(shí)、所述類的日志記錄內(nèi)容的標(biāo)識(shí)、所述類的日志記錄方式的標(biāo)識(shí);
日志記錄模塊52,用于當(dāng)所述類的日志記錄方式為開始記錄所述類的日志時(shí),為所述類建立代理類,通過所述代理類按照所述類的日志記錄內(nèi)容記錄所述類的日志,其中,所述代理類具有日志記錄功能。
其中,日志記錄模塊52包括:
生成子模塊,用于采用動(dòng)態(tài)生成類的方式生成所述代理類,所述代理類持有所述類的引用,所述代理類中的方法與所述類中的方法一一對(duì)應(yīng)。
其中,日志記錄模塊52包括:
確定子模塊,用于在接收到所述類的業(yè)務(wù)請(qǐng)求時(shí),確定所述類中執(zhí)行所述業(yè)務(wù)請(qǐng)求的方法為第一方法,確定所述代理類中與所述第一方法對(duì)應(yīng)的方法為第二方法;
記錄子模塊,用于在所述類的日志記錄內(nèi)容包括所述第一方法對(duì)應(yīng)的日志記錄內(nèi)容時(shí),通過所述第二方法調(diào)用所述第一方法執(zhí)行所述業(yè)務(wù)請(qǐng)求,并通過所述第二方法按照所述第一方法對(duì)應(yīng)的日志記錄內(nèi)容記錄所述類的日志,其中,所述第一方法對(duì)應(yīng)的日志記錄內(nèi)容包括所述第一方法在執(zhí)行所述業(yè)務(wù)請(qǐng)求時(shí)的請(qǐng)求參數(shù)和/或執(zhí)行結(jié)果。
本發(fā)明實(shí)施例中的裝置,當(dāng)需要記錄某類的日志時(shí),為該類建立代理類,通過代理類記錄該類的日志。由于生成代理類的過程不需要重啟服務(wù)器,因此通過本發(fā)明實(shí)施例中的裝置在記錄某個(gè)類的日志時(shí),無需重啟服務(wù)器,能夠?qū)崿F(xiàn)日志的靈活記錄,可在不對(duì)生成環(huán)境產(chǎn)生任何影響的前提下動(dòng)態(tài)記錄指定方法的日志,并可縮短軟件調(diào)試過程,提高軟件開發(fā)和調(diào)試效率,解決相關(guān)技術(shù)中對(duì)某個(gè)類和方法新增日志記錄功能時(shí),需要重啟服務(wù)器,從而影響生產(chǎn)環(huán)境、破壞問題現(xiàn)場(chǎng),并使得軟件調(diào)試過程變長(zhǎng),降低軟件開發(fā)和調(diào)試效率的問題。
如圖5所示,本發(fā)明實(shí)施例中的裝置還包括:
暫停日志記錄模塊53,用于當(dāng)所述類的日志記錄方式為暫停記錄所述類的日志時(shí),暫停通過所述代理類按照所述類的日志記錄內(nèi)容記錄所述類的日志。
結(jié)束日志記錄模塊54,用于當(dāng)所述類的日志記錄方式為結(jié)束記錄所述類的日志時(shí),刪除所述類的代理類,以結(jié)束通過所述代理類記錄所述類的日志。
通過本發(fā)明實(shí)施例中的裝置,不僅能夠開始記錄某個(gè)類某個(gè)方法的日志,還能夠暫停記錄某個(gè)類某個(gè)方法的日志,或者結(jié)束記錄某個(gè)類的日志,因此能夠?qū)崿F(xiàn)日志的靈活記錄,滿足軟件調(diào)試過程中遇到的各種情況。
通過本發(fā)明實(shí)施例中的裝置,動(dòng)態(tài)的指定需要記錄日志的類和方法,無需重啟服務(wù)器,可以直接記錄日志。對(duì)于開發(fā)過程,避免了編譯、部署、重啟服務(wù)器的過程,縮短了調(diào)試流程,可以很好的提高程序開發(fā)和調(diào)試的效率。對(duì)于生產(chǎn)環(huán)境而言,可以在不重啟服務(wù)器的情況,新增或結(jié)束動(dòng)態(tài)日志,一方面不會(huì)影響線上功能,另一方面也可以保護(hù)好問題發(fā)生時(shí)的現(xiàn)場(chǎng),有利于問題的復(fù)現(xiàn)和排查,最后,本實(shí)施例中的裝置無需一開始就記錄過多的日志,可以根據(jù)需要?jiǎng)討B(tài)的新增或結(jié)束日志,在一定程度上提高了系統(tǒng)性能。本實(shí)施例中的裝置對(duì)服務(wù)器的原始系統(tǒng)和功能沒有侵入性,對(duì)服務(wù)器性能不產(chǎn)生任何影響。
本發(fā)明實(shí)施例所提供的動(dòng)態(tài)日志記錄裝置可以為設(shè)備上的特定硬件或者安裝于設(shè)備上的軟件或固件等。本發(fā)明實(shí)施例所提供的裝置,其實(shí)現(xiàn)原理及產(chǎn)生的技術(shù)效果和前述方法實(shí)施例相同,為簡(jiǎn)要描述,裝置實(shí)施例部分未提及之處,可參考前述方法實(shí)施例中相應(yīng)內(nèi)容。所屬領(lǐng)域的技術(shù)人員可以清楚地了解到,為描述的方便和簡(jiǎn)潔,前述描述的系統(tǒng)、裝置和單元的具體工作過程,均可以參考上述方法實(shí)施例中的對(duì)應(yīng)過程,在此不再贅述。
在本發(fā)明所提供的實(shí)施例中,應(yīng)該理解到,所揭露裝置和方法,可以通過其它的方式實(shí)現(xiàn)。以上所描述的裝置實(shí)施例僅僅是示意性的,例如,所述單元的劃分,僅僅為一種邏輯功能劃分,實(shí)際實(shí)現(xiàn)時(shí)可以有另外的劃分方式,又例如,多個(gè)單元或組件可以結(jié)合或者可以集成到另一個(gè)系統(tǒng),或一些特征可以忽略,或不執(zhí)行。另一點(diǎn),所顯示或討論的相互之間的耦合或直接耦合或通信連接可以是通過一些通信接口,裝置或單元的間接耦合或通信連接,可以是電性,機(jī)械或其它的形式。
所述作為分離部件說明的單元可以是或者也可以不是物理上分開的,作為單元顯示的部件可以是或者也可以不是物理單元,即可以位于一個(gè)地方,或者也可以分布到多個(gè)網(wǎng)絡(luò)單元上??梢愿鶕?jù)實(shí)際的需要選擇其中的部分或者全部單元來實(shí)現(xiàn)本實(shí)施例方案的目的。
另外,在本發(fā)明提供的實(shí)施例中的各功能單元可以集成在一個(gè)處理單元中,也可以是各個(gè)單元單獨(dú)物理存在,也可以兩個(gè)或兩個(gè)以上單元集成在一個(gè)單元中。
所述功能如果以軟件功能單元的形式實(shí)現(xiàn)并作為獨(dú)立的產(chǎn)品銷售或使用時(shí),可以存儲(chǔ)在一個(gè)計(jì)算機(jī)可讀取存儲(chǔ)介質(zhì)中?;谶@樣的理解,本發(fā)明的技術(shù)方案本質(zhì)上或者說對(duì)現(xiàn)有技術(shù)做出貢獻(xiàn)的部分或者該技術(shù)方案的部分可以以軟件產(chǎn)品的形式體現(xiàn)出來,該計(jì)算機(jī)軟件產(chǎn)品存儲(chǔ)在一個(gè)存儲(chǔ)介質(zhì)中,包括若干指令用以使得一臺(tái)計(jì)算機(jī)設(shè)備(可以是個(gè)人計(jì)算機(jī),服務(wù)器,或者網(wǎng)絡(luò)設(shè)備等)執(zhí)行本發(fā)明各個(gè)實(shí)施例所述方法的全部或部分步驟。而前述的存儲(chǔ)介質(zhì)包括:U盤、移動(dòng)硬盤、只讀存儲(chǔ)器(ROM,Read-Only Memory)、隨機(jī)存取存儲(chǔ)器(RAM,Random Access Memory)、磁碟或者光盤等各種可以存儲(chǔ)程序代碼的介質(zhì)。
應(yīng)注意到:相似的標(biāo)號(hào)和字母在下面的附圖中表示類似項(xiàng),因此,一旦某一項(xiàng)在一個(gè)附圖中被定義,則在隨后的附圖中不需要對(duì)其進(jìn)行進(jìn)一步定義和解釋,此外,術(shù)語“第一”、“第二”、“第三”等僅用于區(qū)分描述,而不能理解為指示或暗示相對(duì)重要性。
最后應(yīng)說明的是:以上所述實(shí)施例,僅為本發(fā)明的具體實(shí)施方式,用以說明本發(fā)明的技術(shù)方案,而非對(duì)其限制,本發(fā)明的保護(hù)范圍并不局限于此,盡管參照前述實(shí)施例對(duì)本發(fā)明進(jìn)行了詳細(xì)的說明,本領(lǐng)域的普通技術(shù)人員應(yīng)當(dāng)理解:任何熟悉本技術(shù)領(lǐng)域的技術(shù)人員在本發(fā)明揭露的技術(shù)范圍內(nèi),其依然可以對(duì)前述實(shí)施例所記載的技術(shù)方案進(jìn)行修改或可輕易想到變化,或者對(duì)其中部分技術(shù)特征進(jìn)行等同替換;而這些修改、變化或者替換,并不使相應(yīng)技術(shù)方案的本質(zhì)脫離本發(fā)明實(shí)施例技術(shù)方案的精神和范圍。都應(yīng)涵蓋在本發(fā)明的保護(hù)范圍之內(nèi)。因此,本發(fā)明的保護(hù)范圍應(yīng)所述以權(quán)利要求的保護(hù)范圍為準(zhǔn)。