发明内容
本发明正是基于上述问题,提出了一种日志记录技术,能够对日志所需记录内容进行配置,灵活而方便地记录系统的日志。
有鉴于此,本发明提出了一种日志记录装置,包括:模型存储单元,用于存储方法与操作的关联关系、所述操作与实体的关联关系,以及所述实体的属性信息;拦截单元,用于对系统调用的方法进行拦截;获取单元,用于根据预设的需要记录日志的属性信息的类型,获取所述系统调用的方法所属的操作相对应的实体的属性信息;记录单元,用于记录所述系统调用的方法所属的操作相对应的实体的属性信息以生成日志。
在该技术方案中,可以通过元数据描述方法、操作、实体,然后存储方法与操作、操作与实体的关联关系,以及实体的属性信息,当系统调用方法执行操作时,可以拦截该方法,并根据该方法查询对应的操作,进而根据该操作查询该操作对应的实体,最终查询该实体的属性信息以记录日志,这使得应用日志可以记录操作的对象,并且能够在不同的系统中进行记录日志,记录过程更加灵活,通用性强,易于扩展,而且用户可以设置需要记录日志的属性信息的类型,满足了同用户的不同的需要。
在上述技术方案中,优选地,所述记录单元还用于,存储需要记录日志的操作的类型以及所述实体中需要记录的属性信息的类型;则所述日志记录装置还包括:判断单元,用于判断所述系统调用的方法相对应的操作是否需要记录日志;则所述获取单元用于,在所述判断单元的判断结果为是的情况下,获取所述系统调用的方法所属的操作相对应的实体中需要记录的属性信息并生成所述日志。
在该技术方案中,用户可以设置需要记录日志的操作的类型,在拦截方法后,当判定该方法所属的操作需要记录时,才获取相应的实体的属性信息并进行记录,这进一步提高了该装置的可操作性,更容易满足不同用户的不同需求。
在上述技术方案中,优选地,所述模型存储单元还用于,存储所述操作与日志类型的关联关系,则所述记录单元还用于,根据所述操作相对应的日志的类型,以相应的方式生成所述日志。
在该技术方案中,针对不同的操作,设置相应的日志类型,比如新增类型、修改类型和删除类型,针对不同的日志类型,则需要设置相应的策略形成日志。
在上述技术方案中,优选地,所述记录单元还用于,通过结构化方法记录所述属性信息以生成所述日志,则所述日志记录装置还包括:显示单元,用于根据展现处理类解析所述日志并进行显示。
在该技术方案中,通过结构化方法记录日志,使得其他应用在展现日志时,可以根据其结构化特点,选择不同格式进行展现。
在上述任一技术方案中,优选地,还包括:处理单元,用于将所述日志添加至异步队列中,以对所述日志进行持久化处理。
在该技术方案中,通过异步队列可以对日志进行批量的处理,提高日志配置的效率。
根据本发明的又一方面,还提出了一种日志记录方法,包括:步骤202,存储方法与操作的关联关系、所述操作与实体的关联关系,以及所述实体的属性信息;步骤204,对系统调用的方法进行拦截,根据预设的需要记录日志的属性信息的类型,获取所述系统调用的方法所属的操作相对应的实体的属性信息,并进行记录以生成所述日志。
在该技术方案中,可以通过元数据描述方法、操作、实体,然后存储方法与操作、操作与实体的关联关系,以及实体的属性信息,当系统调用方法执行操作时,可以拦截该方法,并根据该方法查询对应的操作,进而根据该操作查询该操作对应的实体,最终查询该实体的属性信息以记录日志,这使得应用日志可以记录操作的对象,并且能够在不同的系统中进行记录日志,记录过程更加灵活,通用性强,易于扩展,而且用户可以设置需要记录日志的属性信息的类型,满足了同用户的不同的需要。
在上述技术方案中,优选地,所述步骤202还包括:存储需要记录日志的操作的类型以及所述实体中需要记录的属性信息的类型;则所述步骤204还包括:判断所述系统调用的方法相对应的操作是否需要记录日志,若需要,则获取所述系统调用的方法所属的操作相对应的实体中需要记录的属性信息并生成所述日志。
在该技术方案中,用户可以设置需要记录日志的操作的类型,在拦截方法后,当判定该方法所属的操作需要记录时,才获取相应的实体的属性信息并进行记录,这进一步提高了该装置的可操作性,更容易满足不同用户的不同需求。
在上述技术方案中,优选地,所述步骤202还包括:存储所述操作与日志类型的关联关系;则所述步骤204还包括:根据所述操作相对应的日志的类型,以相应的方式生成所述日志。
在该技术方案中,针对不同的操作,设置相应的日志类型,比如新增类型、修改类型和删除类型,针对不同的日志类型,则需要设置相应的策略形成日志。
在上述技术方案中,优选地,所述步骤204还包括:通过结构化方法记录所述属性信息以生成所述日志,以根据展现处理类解析所述日志并进行显示。
在该技术方案中,通过结构化方法记录日志,使得其他应用在展现日志时,可以根据其结构化特点,选择不同格式进行展现。
在上述任一技术方案中,优选地,还包括:将所述日志添加至异步队列中,以对所述日志进行持久化处理。
在该技术方案中,通过异步队列可以对日志进行批量的处理,提高日志配置的效率。
通过以上技术方案,能够对日志所需记录内容进行配置,提高日志记录的灵活性和方便性。
具体实施方式
为了能够更清楚地理解本发明的上述目的、特征和优点,下面结合附图和具体实施方式对本发明进行进一步的详细描述。需要说明的是,在不冲突的情况下,本申请的实施例及实施例中的特征可以相互组合。
在下面的描述中阐述了很多具体细节以便于充分理解本发明,但是,本发明还可以采用其他不同于在此描述的其他方式来实施,因此,本发明的保护范围并不受下面公开的具体实施例的限制。
图1示出了根据本发明的实施例的日志记录装置的框图。
如图1所示,根据本发明的实施例的日志记录装置100包括:模型存储单元102,用于存储方法与操作的关联关系、操作与实体的关联关系,以及实体的属性信息;拦截单元104,用于对系统调用的方法进行拦截;获取单元106,用于根据预设的需要记录日志的属性信息的类型,获取系统调用的方法所属的操作相对应的实体的属性信息;记录单元108,用于记录系统调用的方法所属的操作相对应的实体的属性信息以生成日志。
可以通过元数据描述方法、操作、实体,然后存储方法与操作、操作与实体的关联关系,以及实体的属性信息,当系统调用方法执行操作时,可以在应用服务器上调用拦截操作以拦截该方法,并根据该方法查询对应的操作,进而根据该操作查询该操作对应的实体,最终查询该实体的属性信息以记录日志,这使得应用日志可以记录操作的对象,并且能够在不同的系统中进行记录日志,记录过程更加灵活,通用性强,易于扩展,而且用户可以设置需要记录日志的属性信息的类型,满足了同用户的不同的需要。
优选地,记录单元108还用于,存储需要记录日志的操作的类型以及实体中需要记录的属性信息的类型;则日志记录装置100还包括:判断单元110,用于判断系统调用的方法相对应的操作是否需要记录日志;则获取单元106用于,在判断单元110的判断结果为是的情况下,获取系统调用的方法所属的操作相对应的实体中需要记录的属性信息并生成日志。
用户可以设置需要记录日志的操作的类型,在拦截方法后,当判定该方法所属的操作需要记录时,才获取相应的实体的属性信息并进行记录,这进一步提高了该装置的可操作性,更容易满足不同用户的不同需求。
优选地,模型存储单元102还用于,存储操作与日志类型的关联关系,则记录单元108还用于,根据操作相对应的日志的类型,以相应的方式生成日志。
针对不同的操作,设置相应的日志类型,比如新增类型、修改类型和删除类型,针对不同的日志类型,则需要设置相应的策略形成日志。对于新增类型,可以在系统调用操作完成后,查询操作相应的对象的属性信息,并记录生成日志;对于删除类型,可以在系统调用操作前,查询操作相应的对象的属性信息,并记录生成日志;对于修改类型,可以分别在系统调用操作前和系统调用操作后,分别查询操作相应的对象的属性信息,以形成修改前后的变化信息,并记录生成日志。
优选地,记录单元108还用于,通过结构化方法记录属性信息以生成日志,则日志记录装置100还包括:显示单元112,用于根据展现处理类解析日志并进行显示。
通过结构化方法记录日志,使得其他应用在展现日志时,可以根据其结构化特点,选择不同格式进行展现。日志内容包括日志概要信息和日志明细信息,概要信息中包括操作人员、时间、实体类型、操作、客户端IP等信息,可以从拦截的上下文中得到,具体内容可以通过如下结构描述:
其中记录变化前后的数据内容,并且记录实体的ID,用于区分不同数据。通过上述结构可以支持不同类型的对象记录日志而无需调整持久化结构,在进行显示时,根据需要使用的展现处理类解析上述信息以提供不同格式的显示。
优选地,根据本发明的实施例的日志记录装置100还包括:处理单元114,用于将日志添加至异步队列中,以对日志进行持久化处理。
通过异步队列可以对日志进行批量的处理,提高日志配置的效率。
图2示出了根据本发明的实施例的日志记录方法的流程图。
如图2所示,根据本发明的实施例的日志记录方法包括:步骤202,存储方法与操作的关联关系、操作与实体的关联关系,以及实体的属性信息;步骤204,对系统调用的方法进行拦截,根据预设的需要记录日志的属性信息的类型,获取系统调用的方法所属的操作相对应的实体的属性信息,并进行记录以生成所述日志。
可以通过元数据描述方法、操作、实体,然后存储方法与操作、操作与实体的关联关系,以及实体的属性信息,当系统调用方法执行操作时,可以在应用服务器上调用拦截操作以拦截该方法,并根据该方法查询对应的操作,进而根据该操作查询该操作对应的实体,最终查询该实体的属性信息以记录日志,这使得应用日志可以记录操作的对象,并且能够在不同的系统中进行记录日志,记录过程更加灵活,通用性强,易于扩展,而且用户可以设置需要记录日志的属性信息的类型,满足了同用户的不同的需要。
优选地,步骤202还包括:存储需要记录日志的操作的类型以及实体中需要记录的属性信息的类型;则步骤204还包括:判断系统调用的方法相对应的操作是否需要记录日志,若需要,则获取系统调用的方法相对应的操作所属的实体中需要记录的属性信息并生成所述日志。
用户可以设置需要记录日志的操作的类型,在拦截方法后,当判定该方法所属的操作需要记录时,才获取相应的实体的属性信息并进行记录,这进一步提高了该装置的可操作性,更容易满足不同用户的不同需求。
优选地,步骤202还包括:存储操作与日志类型的关联关系;则步骤204还包括:根据操作相对应的日志的类型,以相应的方式生成日志。
针对不同的操作,设置相应的日志类型,比如新增类型、修改类型和删除类型,针对不同的日志类型,则需要设置相应的策略形成日志。对于新增类型,可以在系统调用操作完成后,查询操作相应的对象的属性信息,并记录生成日志;对于删除类型,可以在系统调用操作前,查询操作相应的对象的属性信息,并记录生成日志;对于修改类型,可以分别在系统调用操作前和系统调用操作后,分别查询操作相应的对象的属性信息,以形成修改前后的变化信息,并记录生成日志。
优选地,步骤204还包括:通过结构化方法记录属性信息以生成日志,以根据展现处理类解析日志并进行显示。
通过结构化方法记录日志,使得其他应用在展现日志时,可以根据其结构化特点,选择不同格式进行展现。日志内容包括日志概要信息和日志明细信息,概要信息中包括操作人员、时间、实体类型、操作、客户端IP等信息,可以从拦截的上下文中得到,具体内容可以通过如下结构描述:
其中记录变化前后的数据内容,并且记录实体的ID,用于区分不同数据。通过上述结构可以支持不同类型的对象记录日志而无需调整持久化结构,在进行显示时,根据需要使用的展现处理类解析上述信息以提供不同格式的显示。
优选地,根据本发明的实施例的日志记录方法还包括:将日志添加至异步队列中,以对日志进行持久化处理。
通过异步队列可以对日志进行批量的处理,提高日志配置的效率。
图3示出了根据本发明的实施例的日志记录方法的具体流程图。
如图3所示,根据本发明的实施例的日志记录方法具体包括:
步骤302,构建实体模型,通过元数据描述系统操作的对象(实体)的组成,实体中属性的类型、名称,以及实体之间的关系;构建操作模型,操作归属于实体,通过元数据描述操作对应代码实现的方法名称、参数、返回值等信息,以及接口参数与实体的关系;
步骤304,配置日志规则,设置需要记录日志的操作类型,设置需要记录的实体的属性信息的类型;
步骤306,拦截系统调用的方法,可以通过AOP(Aspect OrientedProgramming,面向切面编程)技术进行拦截;
步骤308,根据拦截的方法,操作模型中查询相应的操作;
步骤310,根据操作模型中的信息判断当前操作的类型是否属于需要记录的操作的类型;
步骤312,若需要记录,则根据操作模型中的信息查询该操作对应的实体,并获取该实体的属性信息中需要记录的属性信息,以生成日志;
步骤314,将日志信息送入异步队列进行处理,以完成日志的持久化。
图4示出了根据本发明的实施例的日志记录装置的结构图。
如图4所示,根据本发明的实施例的日志记录装置可以包括:模型描述单元402,日志设置单元404,日志形成单元406,日志记录单元408。
模型描述单元402通过元数据描述系统的实体模型和操作模型,并记录在系统中供系统运行时使用。
实体模型通过实体组件、属性和关系描述,并且实体模型描述实体、属性与对应持久化结构的关系。其描述内容可以通过xml文件或者数据库表记录。
通过数据库表记录实体模型可以如表1至表3所示结构:
表1
表1记录实体组件内容,实体组件用于描述实体的唯一标识、编码、名称等,以及描述能够唯一区分实体对象的主属性信息,并且描述实体持久化对应的存储信息和对象的访问方法信息,分别用于持久化和对象访问使用。实体全类名描述实体对应的实现类类型。
表2
表2记录属性描述内容,描述了属性的归属实体,属性的类型和类型样式,其中,属性的类型可以是其他实体,类型样式可以是引用和/或组合,同时,属性描述中还描述了属性对应的持久化结构信息,如果使用数据库表存储,还需要描述明确表名、字段名和字段属性。
表3
表3记录了实体之间的关系,实体与实体之间是引用关系,还是组合关系或者继承关系,通过实体间关系可以描述复杂结构的对象。其中包括源实体的哪个属性引用或者是组合了其他实体。没有被其他实体组合的实体是主实体,反之为子实体。
操作模型可以对系统中提供的操作进行描述。操作都是针对于实体进行的,操作归属于实体。因此,在操作模型中需要记录操作的所属实体。操作模型中针对每一个操作需要描述此操作是否需要记录日志,并且描述日志的类型(新增类型、修改类型和删除类型)。操作模型还需要描述每个操作对应系统实现代码中的类、方法以及方法的参数、返回值及其类型。各参数的描述中需要描述参数与实体的关联关系,具体包括主实体、子实体、主实体ID、子实体ID、其他包含实体ID的结构等不同种类的关联关系。对于不同的关联关系提供不同的查找实体或者子实体的方法。一个操作可以对应一个或者多个系统的方法,一个方法可以没有参数可以有一个或者多个参数。操作模型的描述内容可以通过xml文件或者数据库表记录。
通过数据库表记录操作模型可以如表4至表7所示结构:
表4
表4记录操作的信息,其中操作的ID唯一地标识一个操作。
表5
表5记录了接口方法信息,其中方法ID唯一地标识一个接口方法;方法签名用于方法名、返回值类型、参数类型的形成方法的描述。
表6
表6记录了方法的参数信息,其中参数ID唯一地确定一个方法的参数,序号描述方法的各个参数的顺序,日志类型描述参数与实体的关系,参数描述中可以描述参数的含义,对于子实体ID关联关系的参数,其中描述了子实体的全类名,用于区分实体中存在多个子实体的时候当前使用的是哪个具体的子实体。对于其他包含实体ID的数据结构,记录从数据结构中得到的访问全路径,可以采用如下结构进行记录:
需要注册成pachage.upinfo~getClerkID。
表7
表7记录操作与方法之间的对应关系,一个方法只能属于一个操作,一个操作可以对应多个方法。
日志设置单元404通过查询模型中具有可记录日志操作的实体,以及实体的属性和可记录日志的操作形成可设置记录日志的信息。对于实体的操作分别设置是否记录日志以及日志需要记录的属性集合。
可以通过以下过程查询可记录日志的实体、操作和属性:
1.查询标记为可以记录日志的操作,通过类似于以下SQL(结构化查询语言)查询:select * from操作where是否记录日志=‘是’;
2.循环遍历1的结果得到需要记录日志实体ID集合A,同时,将操作按照实体ID分组放到Map中。通过以下查询得到实体:select * from实体where实体ID in(A)得到结果集B;
3.通过以下查询得到实体的属性:select * from属性where实体ID in(A)得到结果集C;
4.循环遍历结果集C,按照实体ID为Key将属性分组放到Map中;
5.循环遍历结果集B,并用对应的实体ID得到操作集合和属性集合形成备选实体、属性和操作对象。
对于实体、属性和操作的关系可以记录在xml或者数据库表中,通过数据库表记录的形式如表8所示,
表8
其中序号用于描述日志内容中属性值的记录先后顺序。
日志形成单元406可以通过AOP技术拦截系统对方法的调用,通过拦截到的方法信息查询相应的操作,进而确定是否需要记录日志。如果需要记录日志,根据方法对应的操作中描述的记录日志类型确定日志形成策略,通过参数实体关联关系的不同类型查找到对应的实体。根据日志配置信息中设置的属性,通过实体的访问器读取相应属性值形成日志内容。
具体处理过程如图5所示,包括:
步骤502,通过AOP拦截系统对方法的调用;
步骤504,根据拦截的方法进行反射以形成方法的签名,根据方法的签名查询方法对应的操作;
步骤506,读取操作信息,判断是否需要记录日志;
步骤508,若需要记录日志,进一步判断日志的类型,并根据日志类型确定日志的形成策略;
步骤510,若日志类型为修改类型,则在调用操作前,根据方法参数中注册的日志参数关联关系查询对应的实体或子实体;
步骤512,调用操作后,根据方法参数中的注册方法查询对应的实体或子实体;
步骤514,根据日志配置中的属性,实体中注册的访问器分别访问操作调用前后的实体,形成修改前后变化信息,进而生成日志;
步骤516,将日志添加至异步队列进行持久化处理;
步骤518,若日志类型为增加类型,在调用操作完成后,根据日志配置信息,实体中注册的访问器访问实体中的属性信息,以生成日志,并返回步骤516;
步骤520,若日志类型为删除类型,在调用操作前,根据方法参数中注册的日志参数关联关系查询对应的实体,根据日志配置信息和实体访问器访问实体中的属性信息,以生成日志信息,并返回步骤516。
需要根据不同参数实体的关联关系,提供不同的实体查找方法,不同参数实体类型查询实体的方法如下:
1.主实体对象
在这种情况下,如果操作是新增和删除类型,那么日志只需要该对象本身的内容,可以直接获取,而对于修改类型的操作,需要获取其修改前的数据信息,通过实体描述的访问器方式获取实体中的实体ID值,再通过实体模型中的描述对应数据库表和属性形成查询语句,在数据库中查找其修改前的数据对象。
2.主实体ID
通常,在这种情况下操作是用来进行数据删除,需要根据实体上的定义,根据主键查询其对应的数据对象(方法同主实体对象中通过ID查询修改前对象)。
3.子实体对象
在这种情况下通过子实体对象中记录的父实体ID,然后按照条目2的方式查询到主实体,将子实体添加到主实体形成只包含部分子实体的实体对象。
4.子实体ID
首先,根据操作模型中的方法参数描述的子实体全类名信息,从实体模型中得到子实体的相应描述同条目2中的描述查询子实体。然后按照条目3的处理过程得到只包含部分子实体的实体对象。
5.其它包含实体ID的结构
通过参数描述中描述的属性访问全路径使用反射机制从参数中得到实体ID。例如参数描述注册的是pachage.upinfo~getClerkID,通过对象反射调用参数pachage.upinfo的getClerkID方法得到实体ID。得到ID后的处理同条目2。
日志记录单元408用于处理日志的具体记录。
日志记录过程有大量的应用操作需要记录日志,为了降低对效率的影响,可以采用分散存储和异步记录的方式处理。
日志存储可以使用如下结构记录:
其中logmsg用于记录日志详细信息,以及记录结构化的日志详细内容。
对于不同的对象的日志可以存储在同结构的不同存储表中,通过在日志服务器中日志记录配置文件中增加描述明确实体记录的存储表,结构如下所示:
A实体ID=日志存储表1
B实体ID=日志存储表2
没有配置的日志可以记录在默认存储表中。
日志记录的处理过程如图6所示,包括:
步骤602,判断日志队列是否创建,队列为系统内存中的先进先出数据结构;
步骤604,若已创建队列,则将日志添加至队列,同时启动定时器,定时器是定时触发的程序组件,当定时器时间到达后会自动调用预置的处理过程。根据应用系统的繁忙程度设置定时器的时间,一般可以设置为1分钟;
步骤606,采用异步方式判断队列中的待持久化日志数量是否达到事先设定的阈值,阈值可以根据系统的繁忙程度设置,一般情况将阈值设置为1000,如果未达到阈值则等待;
步骤608,如果达到阈值,根据日志中的实体类型确定日志持久化的表,批量将日志插入到日志表中;
步骤610,将队列中已经持久化的日志进行出队处理,将其从队列中删除;
步骤612,将定时器重新设置开始计时;
步骤614,如果没有创建则创建队列,则创建队列并同时启动定时器,并进行步骤604。
需要说明的是,当定时器定时时间到达,只要队列中有待记录的日志,无论是否达到阈值都将日志记录到数据库表中,并且重新设置定时器,重新开始计时。
本发明可以在软件系统进行应用操作后,灵活的配置哪些操作需要记录日志,以及配置日志中记录哪些内容。可以不修改代码,仅仅是增加配置实现对新的业务操作实现记录日志功能。通过队列技术,大大降低了记录日志的I/O操作数量,降低了日志记录的系统开销,提升了系统的执行效率。实现了高效、准确、按需记录应用日志。
以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。