專利名稱:一種記錄日志的方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種記錄日志的方法,并且尤其涉及基于AOP技術(shù)的記錄日志的方法。
背景技術(shù):
傳統(tǒng)的程序通常表現(xiàn)出一些不能自然地適合單一的程序模塊或者是幾個緊密相關(guān)的程序模塊的行為。例如,面向?qū)ο缶幊剃P(guān)注將需求功能劃分為不同的并且相對獨立、封裝良好的類,并讓它們有著屬于自己的行為,依靠繼承和多態(tài)等來定義彼此的關(guān)系。因此,例如,當(dāng)要對一個更新操作進行關(guān)于操作人員和數(shù)據(jù)庫變更的日志記錄時,需要在實現(xiàn)更新操作接口的實現(xiàn)類中添加實現(xiàn)日志記錄的過程。如此,如果要實現(xiàn)多個接口,就要在每個實現(xiàn)的類中都添加這些記錄過程。在系統(tǒng)開發(fā)的過程中,業(yè)務(wù)代碼中的這些非業(yè)務(wù)功能的代碼,例如日志記錄,常常會造成代碼結(jié)構(gòu)混亂。而且,這將導(dǎo)致開發(fā)人員不斷重復(fù)的相同 的工作,并且容易增加產(chǎn)生錯誤的代碼的可能性。理想地,希望將通用的功能從不相關(guān)的類當(dāng)中分離出來,由此使得多個類共享一種行為。從而,一旦這種行為發(fā)生變化,不必修改多個類而只需要修改這個行為即可。在AOP(Aspect OrientedProgramming)中,這種行為被稱為橫切,其跨越了給定編程模型中的典型職責(zé)界限。常見的一些橫切行為有,例如,日志記錄、跟蹤、事務(wù)的處理、持久化等。因此,需要一種記錄日志的方法,來定義交叉的關(guān)系,并將這些關(guān)系應(yīng)用于跨模塊的、彼此不同的對象模型,從而使得代碼有更好的可讀性和易于維護,同時增加程序開發(fā)的透明性和類的擴展性,提高系統(tǒng)開發(fā)效率和開發(fā)系統(tǒng)的穩(wěn)定性。
發(fā)明內(nèi)容
本發(fā)明提供了一種在JEE程序開發(fā)中基于AOP (面向方面編程)技術(shù)的記錄操作日志和記錄數(shù)據(jù)庫審計日志的實現(xiàn)方法。操作日志主要描述特定人員所作的業(yè)務(wù)操作,數(shù)據(jù)庫審計日志主要描述所作的業(yè)務(wù)操作帶來的數(shù)據(jù)變化。通過該實現(xiàn),在JEE應(yīng)用開發(fā)過程中使開發(fā)人員更加關(guān)注于具體業(yè)務(wù)實現(xiàn),而將操作日志和數(shù)據(jù)庫審計日志等非核心業(yè)務(wù)技術(shù)實現(xiàn)通過配置由底層實現(xiàn)來完成。根據(jù)本發(fā)明的一個目的,提供了一種在JEE開發(fā)環(huán)境下記錄操作日志和數(shù)據(jù)庫審計日志的方法,其特征在于,包括以下步驟A、利用EJB中提供的面向方面編程的實現(xiàn),記錄操作日志,其中,在記錄操作日志時,利用Java反射機制讀取業(yè)務(wù)邏輯方法的JavaAnnotation獲得對于業(yè)務(wù)邏輯方法的描述,所述業(yè)務(wù)邏輯方法的描述至少限定標識操作的operationLogld 屬性值,然后,利用operationLogld 屬性值構(gòu)造 OperationLog 對象;B、執(zhí)行業(yè)務(wù)邏輯方法;C、分別在作為實體對象的生命周期的PostPersit, PostUpdate和PostRemove過程后,記錄數(shù)據(jù)庫審計日志,其中,記錄數(shù)據(jù)庫審計日志包括以下步驟a、利用Java反射機制讀取實體對象的屬性名稱,b、利用Java反射機制根據(jù)屬性名稱獲取該屬性對應(yīng)的值,C、根據(jù)屬性當(dāng)前值與屬性變更前的值,構(gòu)造AuditLog對象。優(yōu)選地,OperationLog對象與AuditLog對 象是一對多的關(guān)系,OperationLog對象包括標識操作的operationLogld屬性,AuditLog對象包括標識操作的operationld屬性,其中,所述方法使該operationLogld屬性與該operationld屬性關(guān)聯(lián)。優(yōu)選地,在基于B/S的JEE開發(fā)環(huán)境的情況下,所述方法在步驟B中進一步構(gòu)造OperationLog對象,使其包括用戶信息屬性值,其中,從保存用戶信息的session中獲取用戶信息屬性值,并將用戶信息屬性值綁定到當(dāng)前的執(zhí)行線程上;在執(zhí)行業(yè)務(wù)邏輯方法時,從該執(zhí)行線程獲取用戶信息屬性值,并利用該用戶信息屬性值進一步構(gòu)造OperationLog對象。優(yōu)選地,通過以下步驟使所述operationLogld屬性與所述operationld屬性關(guān)聯(lián)在步驟A中,將構(gòu)造OperationLog對象產(chǎn)生的operationLogld屬性值綁定到當(dāng)前的執(zhí)行線程上,在步驟C中,從該執(zhí)行線程獲取operationLogld屬性值,以及將該operationLogld屬性值傳遞給AuditLog對象的operationld屬性值。根據(jù)本發(fā)明的另一個目的,提供了一種在JEE開發(fā)環(huán)境下構(gòu)建操作日志對象和數(shù)據(jù)庫審計日志對象的方法,其特征在于,所述操作日志對象和所述數(shù)據(jù)庫審計日志對象通過自定義的元數(shù)據(jù)配置關(guān)聯(lián)。優(yōu)選地,所述操作日志對象包括標識操作的operationLogld屬性,所述數(shù)據(jù)庫審計日志對象包括標識操作的operationld屬性,其中,該方法通過以下步驟使所述operationLogld屬性與所述operationld屬性關(guān)聯(lián)在構(gòu)造操作日志對象產(chǎn)生operationLogld屬性值時,將其綁定到當(dāng)前的執(zhí)行線程上;在構(gòu)造數(shù)據(jù)庫審計日志對象時,從執(zhí)行線程中獲取operationid屬性值后綁定到數(shù)據(jù)庫審計日志對象,用以維護一對多的關(guān)聯(lián)。根據(jù)本發(fā)明的另一個目的,提供了一種在JEE開發(fā)環(huán)境下構(gòu)建操作日志對象的方法,其特征在于,利用EJB中提供的面向方面編程的實現(xiàn),基于利用Java反射機制獲取操作日志對象的operationLogld屬性值,其中,操作日志對象進一步包括用戶信息屬性,其中,該方法通過下述步驟獲得用戶信息屬性值a、用戶登錄B/S系統(tǒng),用戶信息被放置在session中;b、當(dāng)用戶每執(zhí)行一個業(yè)務(wù)邏輯操作,從session中獲取到用戶信息將其綁定到當(dāng)前的執(zhí)行線程上;C、業(yè)務(wù)邏輯執(zhí)行時從該執(zhí)行線程上獲取到用戶信息。根據(jù)本發(fā)明的另一個目的,提供了一種在JEE開發(fā)環(huán)境下構(gòu)建數(shù)據(jù)庫審計日志對象的方法,其特征在于,分別在作為實體對象的生命周期的PostPersit, PostUpdate和PostRemove過程后,構(gòu)建數(shù)據(jù)庫審計日志對象,其中,構(gòu)建數(shù)據(jù)庫審計日志對象包括以下步驟a、利用Java反射機制讀取實體對象的屬性名稱,b、利用Java反射機制根據(jù)屬性名稱獲取該屬性對應(yīng)的值,
C、根據(jù)屬性當(dāng)前值與屬性變更前的值,構(gòu)造構(gòu)建數(shù)據(jù)庫審計日志對象,其中,操作日志對象進一步包括用戶信息屬性,其中,該方法通過下述步驟獲得用戶信息屬性值a、當(dāng)用戶每執(zhí)行一個業(yè)務(wù)邏輯操作,從session中獲取到用戶信息屬性值將其綁定到當(dāng)前的執(zhí)行線程上;b、業(yè)務(wù)邏輯執(zhí)行時從該執(zhí)行線程上獲取用戶信息屬性值。本發(fā)明的技術(shù)方案減少了邏輯代碼模塊中的非功能性代碼的量和重復(fù)的工作量,降低了其錯誤的可能性。另外,通過配置調(diào)整操作日志和數(shù)據(jù)庫審計日志的應(yīng)用范圍,能夠是應(yīng)用程序快速適應(yīng)對應(yīng)的需求變化。本發(fā)明的應(yīng)用的更大范圍可從后文給出的詳細描述中變得明顯。然而,應(yīng)當(dāng)理解,詳細的描述和具體實施例雖然表示本發(fā)明的優(yōu)選實施例,但僅僅是以示例的方式給出,這是因為根據(jù)這種詳細的描述,在本發(fā)明的精神和范圍內(nèi)的各種變化和修改對于本領(lǐng)域的技術(shù)人員來說將變得明顯。
圖I是根據(jù)本發(fā)明一個實施例的用于實現(xiàn)記錄日志的自定義元數(shù)據(jù)的配置示意圖;圖2是根據(jù)本發(fā)明一個實施例的記錄操作日志的示意圖;圖3是根據(jù)本發(fā)明一個實施例的記錄數(shù)據(jù)庫審計日志的示意圖。
具體實施例方式以下將結(jié)合附圖具體描述本發(fā)明的實施例。圖I是根據(jù)本發(fā)明一個實施例的用于實現(xiàn)記錄日志的自定義元數(shù)據(jù)的配置示意圖。如圖所示,作為示例,用于操作日志記錄的OperationLog對象(操作日志對象)可以包括(I) operationLogld屬性,該屬性用于標識操作,諸如操作ID ;(2) operationUserld屬性和operationUserName屬性,這兩個屬性可以作為用戶信息屬性,即用戶ID和用戶姓名;(3) operationDate屬性,該屬性表示操作日期;(4) operationDesc屬性,該屬性表示操作的業(yè)務(wù)描述;
(5)operationRemark屬性,該屬性用于表示對于操作的補充信息。本領(lǐng)域的技術(shù)人員可以理解的是,OperationLog對象可以包括上述一個或多個屬性。用于數(shù)據(jù)庫審計日志記錄的AuditLog對象(數(shù)據(jù)庫審計日志對象)包括(l)auditLogld屬性,該屬性用于標識審計,例如審計ID ;(2) operationld屬性,該屬性用于標識操作,諸如操作ID ;(3)auditTableName屬性,該屬性用于表示審計的數(shù)據(jù)庫表的名稱;(4)auditFileName屬性,該屬性用于表示審計的文件的名稱;(5)auditDate屬性,該屬性表示審計日期; (6) operationUserld屬性,該屬性作為用戶信息屬性,即用戶ID;(7)oldValue屬性和newValue屬性。這兩個屬性表示數(shù)據(jù)操作的實體對象的屬性值的變化。其中,oldValue值為變更前的值,而newValue的值為變更后的值。本領(lǐng)域的技術(shù)人員可以理解的是,OperationLog對象可以包括上述一個或多個屬性。從圖I可以看出,用于記錄操作日志的OperationLog對象與用于記錄數(shù)據(jù)庫審計日志的AuditLog對象是單向一對多的關(guān)系。并且通過OperationLog對象中的operationLogld屬性與AuditLog對象中的operationld屬性進行關(guān)聯(lián)。以下將根據(jù)圖2以及圖3,詳細描述用于記錄操作日志的OperationLog對象與用于記錄數(shù)據(jù)庫審計日志的AuditLog對象產(chǎn)生過程。圖2是根據(jù)本發(fā)明一個實施例的記錄操作日志,即生成OperationLog對象的示意圖。如圖2所示,調(diào)用者和業(yè)務(wù)邏輯方法是正常的業(yè)務(wù)邏輯代碼或模塊,AOP Proxy是底層AOP技術(shù)實現(xiàn),這里AOP Proxy通過EJB中提供的基于面向方面的編程實現(xiàn)。本領(lǐng)域的技術(shù)人員所熟知的是,在JEE應(yīng)用開發(fā)過程中,通常使用EJB來作為業(yè)務(wù)邏輯的實現(xiàn)方式;并且,本發(fā)明關(guān)注JEE的應(yīng)用開發(fā),由此,在該實施例中,使用標準的EJB的AOP實現(xiàn),即攔截器機制。例如,可以提供一個攔截器BizAuditInterceptor,作為示例,其業(yè)務(wù)方法的偽代碼
如下
QAroundInvoke
public Object.bizAduitLogging (InvocationContext ctx)throws Except ion {
Object o = null; try {
Il執(zhí)行原有的業(yè)務(wù)方法 o = ctx.proceed 0 ;} catch (Exception e) {
logger, error ("業(yè)務(wù)調(diào)用出現(xiàn)錯誤丨丨,e); throw e;
}
//記錄操作日志的邏輯doAdui tLogging (*****);
//返回業(yè)務(wù)返回值return o;}本領(lǐng)域的技術(shù)人員還可以理解的是,根據(jù)EJB中提供的基于面向方面的編程實現(xiàn),還可以根據(jù)需要設(shè)計其它的攔截器。圖2中示出的記錄操作日志的步驟是實現(xiàn)記錄操作日志的邏輯模塊,在該邏輯模塊中產(chǎn)生OperationLog對象。在本發(fā)明的一個實施例中,在記錄操作日志時,可以利用Java反射機制讀取所述業(yè)務(wù)邏輯方法的Java Annotation (Java注釋)獲得對于業(yè)務(wù)邏輯方法的描述。這里,業(yè)務(wù)邏輯方法的描述至少限定標識操作的operationLogld屬性值。然后,利用operationLogld屬性值構(gòu)造OperationLog對象。作為示例,其處理的偽代碼可以
例如
Method m = ctx. getMethod (); //ctx 為 AOP 的執(zhí)行上下文
環(huán)境
BizAuditDescription bizAnnotation = m.getAnnotat ion (BizAudi tDescript ion. class); if (bizAnnotation != null) {
/ /記錄操作日志 recordOperlogging (***);
}在上面的偽代碼中,首先從AOP的執(zhí)行上下文環(huán)境中獲取被攔截到的業(yè)務(wù)方法,即 java. lang. reflect. Method 對象;然后,從該對象中通過利用Java的反射機制獲取到自定義的JavaAnnotation—BizAuditDescription,根據(jù)Annotation是否存在來判斷是否記錄操作日志以及日志的內(nèi)容,即OperationLog對象的屬性。由此,當(dāng)記錄操作日志的對象OperationLog產(chǎn)生異常時,對正常的業(yè)務(wù)邏輯無影響。
圖3是根據(jù)本發(fā)明一個實施例的記錄數(shù)據(jù)庫審計日志的示意圖。本領(lǐng)域的技術(shù)人員已知的是,在JEE應(yīng)用程序中通常采用ORM的對象持久化技術(shù)。因此,在使用JPA技術(shù)進行數(shù)據(jù)操作時,實體對象在整個生命周期中經(jīng)歷了 PrePersist、PostPersit、PostLoad,PreUpdate> PostUpdate、PreRemove> PostRemove等幾個過程。記錄數(shù)據(jù)庫審計日志主要是記錄數(shù)據(jù)實體對象的變化的過程,所以優(yōu)選地選擇PostPersit, PostUpdate, PostRemove作為記錄數(shù)據(jù)庫審計日志的切入點,通過實體對象監(jiān)聽器模塊來完成對于實體對象的CRUD操作的審計日志。這里,可以理解的是,在實體對象監(jiān)聽器可以通過計算機程序代碼實現(xiàn),其可以包括PostPersit, PostUpdate, PostRemove等方法來執(zhí)行記錄數(shù)據(jù)庫審計日志的邏輯,分別對應(yīng)新增保存,更新,刪除的數(shù)據(jù)庫操作。這里,在三個步驟執(zhí)行的過程之后記錄日志。本領(lǐng)域的技術(shù)人員已知的是,這由JEE標準定義,可以由JEE的標準實現(xiàn)來完成。以下描述作為數(shù)據(jù)庫審計日志的AuditLog對象的產(chǎn)生。首先說明對于關(guān)于實體對象的變化值(oldValue和newValue)的處理
a、利用Java反射機制讀取實體對象的屬性名稱,b、利用Java反射機制根據(jù)屬性名稱獲取該屬性對應(yīng)的值,C、根據(jù)屬性當(dāng)前值與屬性變更前的值,構(gòu)造AuditLog對象。作為示例,首先可以使用Java的反射機制讀取實體對象的所有的屬性名稱;其次,利用反射機制根據(jù)屬性名稱獲取該屬性對應(yīng)的值;最后遍歷所有的屬性值獲取屬性當(dāng)前值與變更前的值,并且將這些值進行對比從而來構(gòu)造AuditLog對象用于記錄數(shù)據(jù)庫審計日志。例如,對于新增保存的情況對應(yīng)的AuditLog對象的oIdValue值都是空,而newValue是新增對象的值。對于更新的情況對應(yīng)的AuditLog對象的oldValue值為變更前的值,而newValue的值為變更后的值。對于刪除的情況對應(yīng)的AuditLog對象的oldValue值為刪除前的值,而newValue的值就是為空。由此,記錄數(shù)據(jù)庫審計日志的異常并不會導(dǎo)致業(yè)務(wù)邏輯處理的回滾,業(yè)務(wù)處理能正常處理完成。本發(fā)明所公開的方法的優(yōu)勢在于相關(guān)聯(lián)地進行記錄操作日志記錄數(shù)據(jù)庫審計日志。換句話說,本發(fā)明的實施例對記錄操作日志的OperationLog對象與用于記錄數(shù)據(jù)庫審計日志AuditLog對象通過自定義元數(shù)據(jù)進行相關(guān)聯(lián)地生成。如上所述,用于記錄操作日志的OperationLog對象與用于記錄數(shù)據(jù)庫審計日志的AuditLog對象是單向一對多的關(guān)系。其中,OperationLog對象中的operationLogld屬性與AuditLog對象中的operationld屬性關(guān)聯(lián)。在本發(fā)明的一個實施例中,通過以下步驟使所述operationLogld屬性與所述operationld屬性關(guān)聯(lián)在利用EJB中提供的面向方面編程的實現(xiàn),記錄操作日志的過程中,將構(gòu)造OperationLog對象產(chǎn)生的operationLogld屬性值綁定到當(dāng)前的執(zhí)行線程上,在分別在作為實體對象的生命周期的PostPersit, PostUpdate和PostRemove過程后,記錄數(shù)據(jù)庫審計日志的過程中,從該執(zhí)行線程獲取operationLogld屬性值,以及將該operationLogld屬性值傳遞給AuditLog對象的operationld屬性值。作為示例,對于OperationLog和AuditLog的operationld的傳遞過程可以通過如下步驟進行I、當(dāng)記錄操作日志產(chǎn)生operationLogld屬性值時,將其綁定到當(dāng)前的執(zhí)行線程上;2、在利用實體對象監(jiān)聽器模塊記錄數(shù)據(jù)庫審計日志時,從執(zhí)行線程中獲取operationid屬性值后綁定到AuditLog對象,用以維護一對多的關(guān)聯(lián);3、當(dāng)AuditLog對象處理完成后清理該線程中綁定的operationLogld屬性值。本發(fā)明的另一個實施例,涉及對OperationLog對象中的用戶屬性賦值。在該實施例中,OperationLog對象還包括用戶屬性。在某些情況下,在對操作日志和數(shù)據(jù)庫審計日 志的處理過程中可能需要獲取用戶的信息。本領(lǐng)域的技術(shù)人員所已知的是,基于B/S的JEE應(yīng)用程序使用session機制來保存用戶信息,通常在Web層獲取session信息,而在邏輯層獲取用戶信息通常只能通過參數(shù)傳遞方式來完成。對于跨模塊的信息傳遞也同樣需要通過參數(shù)傳遞來完成。但是有時此類方式并不適用,所以在處理此類問題時本發(fā)明采用了通過Java的線程局部變量來綁定需要傳遞的數(shù)據(jù),供該執(zhí)行線程上的所有處理邏輯來使用。因此,在基于B/S的JEE開發(fā)環(huán)境的情況下,該實施例在記錄操作日志,即產(chǎn)生OperationLog對象時,進一步構(gòu)造OperationLog對象,使其包括用戶信息屬性值,其中,從保存用戶信息的session中獲取用戶信息屬性值,并將用戶信息屬性值綁定到當(dāng)前的執(zhí)行線程上;在執(zhí)行業(yè)務(wù)邏輯方法時,從該執(zhí)行線程獲取用戶信息屬性值,并利用該用戶信息屬性值進一步構(gòu)造OperationLog對象。作為示例,對于用戶信息的處理過程可以包括如下過程I、用戶登錄B/S系統(tǒng)將用戶信息放置在session中;2、當(dāng)用戶每執(zhí)行一個業(yè)務(wù)邏輯操作,從session中獲取到用戶信息將其綁定到當(dāng)前的執(zhí)行線程上(ThreadLocal變量);3、業(yè)務(wù)邏輯執(zhí)行時從該執(zhí)行線程上獲取到用戶信息;4、執(zhí)行完成后清理該執(zhí)行線程上的用戶信息。根據(jù)本發(fā)明的另一個實施例,可以在JEE開發(fā)環(huán)境下構(gòu)建操作日志對象和數(shù)據(jù)庫審計日志對象,其中,操作日志對象和所述數(shù)據(jù)庫審計日志對象通過如上所述的自定義的元數(shù)據(jù)配置關(guān)聯(lián)。該方法借助自定義的元數(shù)據(jù)操作日志對象和數(shù)據(jù)庫審計日志對象,可以在緊密相關(guān)的邏輯模塊內(nèi)實現(xiàn)記錄操作日志和記錄數(shù)據(jù)庫審計日志的操作,大大提高了系統(tǒng)開發(fā)的效率。優(yōu)選地,操作日志對象包括標識操作的operationLogld屬性,數(shù)據(jù)庫審計日志對象包括標識操作的operationld屬性,如上所述地,該方法通過以下步驟使所述operationLogld屬性與所述operationld屬性關(guān)聯(lián)在構(gòu)造操作日志對象產(chǎn)生operationLogld屬性值時,將其綁定到當(dāng)前的執(zhí)行線程上;在構(gòu)造數(shù)據(jù)庫審計日志對象時,從執(zhí)行線程中獲取operationid屬性值后綁定到數(shù)據(jù)庫審計日志對象,用以維護一對多的關(guān)聯(lián)。
通過上文的描述可以理解的是,本發(fā)明還可以分別構(gòu)建操作日志對象和數(shù)據(jù)庫審計日志對象。對于構(gòu)建操作日志的情況,可以利用EJB中提供的面向方面編程的實現(xiàn),并且基于Java反射機制獲取操作日志對象的例如operationLogld屬性值。在一個優(yōu)選的實施例中,操作日志對象進一步包括用戶信息屬性,如上所述,該方法可以通過下述步驟獲得用戶信息屬性值a、當(dāng)用戶每執(zhí)行一個業(yè)務(wù)邏輯操作,從session中獲取到用戶信息將其綁定到當(dāng)前的執(zhí)行線程上;b、業(yè)務(wù)邏輯執(zhí)行時從該執(zhí)行線程上獲取到用戶信息。對于構(gòu)建數(shù)據(jù)庫審計日志對象的情況,可以分別在作為實體對象的生命周期的 PostPersit, PostUpdate和PostRemove過程后,構(gòu)建數(shù)據(jù)庫審計日志對象,其中,構(gòu)建數(shù)據(jù)庫審計日志對象可以包括以下步驟a、利用Java反射機制讀取實體對象的屬性名稱,b、利用Java反射機制根據(jù)屬性名稱獲取該屬性對應(yīng)的值,C、根據(jù)屬性當(dāng)前值與屬性變更前的值,構(gòu)造構(gòu)建數(shù)據(jù)庫審計日志對象。在一個優(yōu)選的實施例中,數(shù)據(jù)庫審計日志對象還可以進一步包括用戶信息屬性,其中,該方法通過下述步驟獲得用戶信息屬性值a、當(dāng)用戶每執(zhí)行一個業(yè)務(wù)邏輯操作,從session中獲取到用戶信息屬性值將其綁定到當(dāng)前的執(zhí)行線程上;b、業(yè)務(wù)邏輯執(zhí)行時從該執(zhí)行線程上獲取用戶信息屬性值。本領(lǐng)域技術(shù)人員可以理解的是,本發(fā)明的上述一個或多個方法邏輯、模塊均可以通過計算機軟件實現(xiàn)。盡管已在本文中參看附圖詳細地描述本發(fā)明的說明性實施例,但本領(lǐng)域技術(shù)者應(yīng)理解,本發(fā)明不限于那些精確實施例,且在不脫離由附加權(quán)利要求界定的本發(fā)明的范疇以及精神的情況下,可在其中實現(xiàn)各種變化以及修改。
權(quán)利要求
1.一種在JEE開發(fā)環(huán)境下記錄操作日志和數(shù)據(jù)庫審計日志的方法,其特征在于,包括以下步驟 A、利用EJB中提供的面向方面編程的實現(xiàn),記錄操作日志,其中, 在記錄操作日志時,利用Java反射機制讀取業(yè)務(wù)邏輯方法的JavaAnnotation獲得對于業(yè)務(wù)邏輯方法的描述,所述業(yè)務(wù)邏輯方法的描述至少限定標識操作的operationLogld屬性值, 然后,利用operationLogld屬性值構(gòu)造OperationLog對象; B、執(zhí)行業(yè)務(wù)邏輯方法; C、分別在作為實體對象的生命周期的PostPersit,PostUpdate和PostRemove過程后,記錄數(shù)據(jù)庫審計日志,其中, 記錄數(shù)據(jù)庫審計日志包括以下步驟 a、利用Java反射機制讀取實體對象的屬性名稱, b、利用Java反射機制根據(jù)屬性名稱獲取該屬性對應(yīng)的值, C、根據(jù)屬性當(dāng)前值與屬性變更前的值,構(gòu)造AuditLog對象。
2.如權(quán)利要求I所述的方法,其特征在于,OperationLog對象與AuditLog對象是一對多的關(guān)系, OperationLog對象包括標識操作的operationLogld屬性, AuditLog對象包括標識操作的operationld屬性,其中, 所述方法使該operationLogld屬性與該operationld屬性關(guān)聯(lián)。
3.如權(quán)利要求2所述的方法,其特征在于,在基于B/S的JEE開發(fā)環(huán)境的情況下,所述方法在步驟B中進一步構(gòu)造OperationLog對象,使其包括用戶信息屬性值,其中, 從保存用戶信息的session中獲取用戶信息屬性值,并將用戶信息屬性值綁定到當(dāng)前的執(zhí)行線程上; 在執(zhí)行業(yè)務(wù)邏輯方法時,從該執(zhí)行線程獲取用戶信息屬性值,并利用該用戶信息屬性值進一步構(gòu)造OperationLog對象。
4.如權(quán)利要求2所述的方法,其特征在于,通過以下步驟使所述operationLogld屬性與所述operationld屬性關(guān)聯(lián) 在步驟A中,將構(gòu)造OperationLog對象產(chǎn)生的operationLogld屬性值綁定到當(dāng)前的執(zhí)行線程上, 在步驟C中,從該執(zhí)行線程獲取operationLogld屬性值,以及將該operationLogld屬性值傳遞給AuditLog對象的operationld屬性值。
5.一種在JEE開發(fā)環(huán)境下構(gòu)建操作日志對象和數(shù)據(jù)庫審計日志對象的方法,其特征在于,所述操作日志對象和所述數(shù)據(jù)庫審計日志對象通過自定義的元數(shù)據(jù)配置關(guān)聯(lián)。
6.如權(quán)利要求5所述的方法,其特征在于, 所述操作日志對象包括標識操作的operationLogld屬性, 所述數(shù)據(jù)庫審計日志對象包括標識操作的operationld屬性, 其中,該方法通過以下步驟使所述operationLogld屬性與所述operationld屬性關(guān)聯(lián) 在構(gòu)造操作日志對象產(chǎn)生operationLogld屬性值時,將其綁定到當(dāng)前的執(zhí)行線程上;在構(gòu)造數(shù)據(jù)庫審計日志對象時,從執(zhí)行線程中獲取operationid屬性值后綁定到數(shù)據(jù)庫審計日志對象,用以維護一對多的關(guān)聯(lián)。
7.一種在JEE開發(fā)環(huán)境下構(gòu)建操作日志對象的方法,其特征在于, 利用EJB中提供的面向方面編程的實現(xiàn),基于利用Java反射機制獲取操作日志對象的operationLogld 屬性值,其中, 操作日志對象進一步包括用戶信息屬性,其中,該方法通過下述步驟獲得用戶信息屬性值 a、當(dāng)用戶每執(zhí)行一個業(yè)務(wù)邏輯操作,從session中獲取到用戶信息將其綁定到當(dāng)前的執(zhí)行線程上; b、業(yè)務(wù)邏輯執(zhí)行時從該執(zhí)行線程上獲取到用戶信息。
8.一種在JEE開發(fā)環(huán)境下構(gòu)建數(shù)據(jù)庫審計日志對象的方法,其特征在于, 分別在作為實體對象的生命周期的PostPersit, PostUpdate和PostRemove過程后,構(gòu)建數(shù)據(jù)庫審計日志對象,其中, 構(gòu)建數(shù)據(jù)庫審計日志對象包括以下步驟 a、利用Java反射機制讀取實體對象的屬性名稱, b、利用Java反射機制根據(jù)屬性名稱獲取該屬性對應(yīng)的值, C、根據(jù)屬性當(dāng)前值與屬性變更前的值,構(gòu)造構(gòu)建數(shù)據(jù)庫審計日志對象,其中, 數(shù)據(jù)庫審計日志對象進一步包括用戶信息屬性,其中,該方法通過下述步驟獲得用戶信息屬性值 a、當(dāng)用戶每執(zhí)行一個業(yè)務(wù)邏輯操作,從session中獲取到用戶信息屬性值將其綁定到當(dāng)前的執(zhí)行線程上; b、業(yè)務(wù)邏輯執(zhí)行時從該執(zhí)行線程上獲取用戶信息屬性值。
全文摘要
本發(fā)明提供了一種在程序開發(fā)中基于AOP(面向方面編程)技術(shù)的記錄操作日志和記錄數(shù)據(jù)庫審計日志的實現(xiàn)方法。操作日志主要描述特定人員所作的業(yè)務(wù)操作,數(shù)據(jù)庫審計日志主要描述所作的業(yè)務(wù)操作帶來的數(shù)據(jù)變化。
文檔編號G06F9/44GK102810057SQ20111014303
公開日2012年12月5日 申請日期2011年5月30日 優(yōu)先權(quán)日2011年5月30日
發(fā)明者瞿爭, 俞志剛 申請人:中國銀聯(lián)股份有限公司