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