一种记录日志的方法

文档序号:6425238阅读:163来源:国知局
专利名称:一种记录日志的方法
技术领域
本发明涉及一种记录日志的方法,并且尤其涉及基于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日
发明者瞿争, 俞志刚 申请人:中国银联股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1