基于mvc架构的日志记录系统及方法

文档序号:10534488阅读:371来源:国知局
基于mvc架构的日志记录系统及方法
【专利摘要】本发明公开了一种基于MVC架构的日志记录系统及方法,其可在不改变源程序代码的基础上,只需要添加一些注解,即可完成日志信息的记录,而且所记录的信息远比切面丰富。所述系统包含:控制层处理模块,用于在所述控制层对所接收到的用户请求进行处理的过程中,在程序执行到所述控制层内其之前设置有注解的方法时,调用该注解的业务逻辑,以提取用户信息;以及服务层处理模块,用于在程序执行到所述服务层内其之前设置有注解的方法时,调用该注解的业务逻辑,以记录日志参数,并将该日志参数与所述用户信息一同存储在日志存储模块内。
【专利说明】
基于MVC架构的日志记录系统及方法
技术领域
[0001 ] 本发明涉及信息技术领域,具体地,涉及一种基于MVC(Model View Controller, 模型-视图-控制器)架构的日志记录系统及方法。
【背景技术】
[0002] 为了了解系统的运行状态,日志记录系统需记录引起数据变化的操作,记录要点 包括何人、何时、何地(例如,IP地址)、做了什么操作、调用的那个方法、引起了哪个对象、内 容发生了什么变化等。目前对日志进行记录主要采用以下两种方式:硬编码以及切面。
[0003] 对于硬编码而言,需要将日志记录程序硬编码至程序代码内。然而,日志记录程序 属于辅助逻辑、并非主要逻辑,如果硬编码在代码内的话,会导致程序代码逻辑混乱、不好 维护。程序代码升级时,需要对代码进行重新编译,污染了代码。
[0004] 对于切面而言,其主要实现的目的是针对业务处理过程中的切面进行提取,它所 面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效 果。然而,该切面方法在切到具体的方法之后,能够记录的信息比较有限。

【发明内容】

[0005] 本发明的目的是提供一种基于MVC架构的日志记录系统及方法,其可在不改变源 程序代码的基础上,只需要添加一些注解逻辑,即可完成日志信息的记录,而且所记录的信 息远比切面丰富。
[0006] 为了实现上述目的,本发明提供一种基于MVC架构的日志记录系统,所述MVC架构 包含控制层及服务层,所述控制层接收用户请求,并根据该用户请求执行该控制层内的方 法,该控制层的方法通过调用所述服务层内的方法而被执行,其中在所述控制层及服务层 内需要拦截的方法所对应的代码之前设置有注解,所述系统包含:控制层处理模块,用于在 所述控制层对所接收到的用户请求进行处理的过程中,在程序执行到所述控制层内其之前 设置有注解的方法所对应的代码时,调用该注解的业务逻辑,以提取用户信息;以及服务层 处理模块,用于在程序执行到所述服务层内其之前设置有注解的方法所对应的代码时,调 用该注解的业务逻辑,以记录日志参数,并将该日志参数与所述用户信息一同存储在日志 存储模块内。
[0007] 其中,所述控制层内的方法所对应的代码之前所设置的注解的业务逻辑可用于指 示所述用户请求内存储用户信息的字段并存储该字段内的用户信息。
[0008] 其中,所述服务层内的方法所对应的代码之前所设置的注解的业务逻辑可用于记 录该方法的执行所导致的参数变化。
[0009] 其中,所述服务层内的方法所对应的代码之前所设置的注解的业务逻辑可用于记 录该方法的执行所操作的参数。
[0010] 其中,所述用于记录所述方法的执行所操作的参数的注解的业务逻辑内还可含有 一注解,该注解的业务逻辑可用于指示所需记录的字段以及所述字段之间的关系。
[0011] 其中,所述字段之间的关系可包含哪一字段为主键字段和/或哪些字段之间为父 子关系。
[0012] 相应地,本发明还提供一种基于MVC架构的日志记录方法,所述MVC架构包含控制 层及服务层,所述控制层接收用户请求,并根据该用户请求执行该控制层内的方法,该控制 层的方法通过调用所述服务层内的方法而被执行,其中在所述控制层及服务层内需要拦截 的方法所对应的代码之前设置有注解,所述方法包含:在所述控制层对所接收到的用户请 求进行处理的过程中,在程序执行到所述控制层内其之前设置有注解的方法所对应的代码 时,调用该注解的业务逻辑,以提取用户信息;以及在程序执行到所述服务层内其之前设置 有注解的方法所对应的代码时,调用该注解的业务逻辑,以记录日志参数,并将该日志参数 与所述用户信息一同存储在日志存储模块内。
[0013] 其中,所述控制层内的方法所对应的代码之前所设置的注解的业务逻辑可用于指 示所述用户请求内存储用户信息的字段并存储该字段内的用户信息。
[0014] 其中,所述服务层内的方法所对应的代码之前所设置的注解的业务逻辑可用于记 录该方法的执行所导致的参数变化。
[0015] 其中,所述服务层内的方法所对应的代码之前所设置的注解的业务逻辑可用于记 录该方法的执行所操作的参数。
[0016] 其中,所述用于记录所述方法的执行所操作的参数的注解的业务逻辑内还可含有 一注解,该注解的业务逻辑可用于指示所需记录的字段以及所述字段之间的关系。
[0017] 其中,所述字段之间的关系可包含哪一字段为主键字段和/或哪些字段之间为父 子关系。
[0018] 本发明通过在注解标识在相关程序代码中(即,控制层及服务层内需要拦截的方 法之前),通过切面拦截注解,并调用该注解的业务逻辑将应该被记录的日志参数记录下 来,并将该日志参数与用户信息一同存储在日志存储模块内,即可完成操作日志信息的记 录(who do what in which time at where)。本发明在不改变源程序代码的基础上,只需 要添加一些注解,即可完成日志信息的记录,而且所记录的信息远比切面丰富。另外,不同 的需要记录日志的系统的数据结构会不一样,而通过本发明,只需要对注解的业务逻辑进 行相应地调整,便可使得本系统适应于不同的需要记录日志的系统,这样极大地提高了本 发明的可扩展性,可适应于各种不同的需要记录日志的系统。
[0019] 本发明的其它特征和优点将在随后的【具体实施方式】部分予以详细说明。
【附图说明】
[0020] 附图是用来提供对本发明的进一步理解,并且构成说明书的一部分,与下面的具 体实施方式一起用于解释本发明,但并不构成对本发明的限制。在附图中:
[0021] 图1为本发明提供的基于MVC架构的日志记录系统的结构示意图;
[0022] 图2为本发明提供的基于MVC架构的日志记录方法的流程图。
[0023] 附图标记说明
[0024] 1〇〇 MVC 架构 110 Controller层
[0025] 120 Service层 200日志记录系统
[0026] 210控制层处理模块 220服务层处理模块
【具体实施方式】
[0027] 以下结合附图对本发明的【具体实施方式】进行详细说明。应当理解的是,此处所描 述的【具体实施方式】仅用于说明和解释本发明,并不用于限制本发明。
[0028] 在对本文发明进行介绍之前,先介绍MVC架构。MVC是一种软件设计典范,用一种业 务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和 个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于 映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。
[0029] MVC架构一般包括:View层、Controller层(即,本申请提及的"控制层")、Service 层(g卩,本申请提及的"服务层")、以及DAO层,本发明的日志记录系统所主要涉及的则为 controller 层和service 层。其中,
[0030] View层主要是负责提供用户视图界面,用户只需对该视图界面进行操作,并不需 要关心后台如何进行处理。
[0031] Controller层其与View层紧密结合,负责具体的业务模块流程的控制,在此层里 面要调用Service层的接口来控制业务流程。
[0032] Service层主要负责业务模块的逻辑应用设计,其向上层的controller层提供接 口,并且使用Dao层提供的接口。Service层的业务逻辑有利于通用的业务逻辑的独立性和 重复利用性,程序显得非常简洁。
[0033] Dao层主要是负责与数据库进行联络。他只负责对数据进行访问,而不管其他的业 务逻辑,在Dao层里面要完成的是数据访问逻辑以及对数据的访问。数据访问,大部分情况 下就是对数据进行操作。Dao层为上层的Service层提供接口。Dao层在操作完成后,如果是 查询,则返回对象,如果是增删改,则仅仅需要返回一个Boolean值表示成功失败即可。 [0034]为了实现上述目的,本发明提供一种基于MVC架构100的日志记录系统200,所述 MVC架构100包含Controller层110及Service层120,所述Controller层110接收用户请求, 并根据该用户请求执行该Control ler层110内的方法,该Control ler层110的方法通过调用 所述Service层120内的方法而被执行(即,通过调用Service层120内的方法而实现业务操 作),其中在所述Controller层110及Service层120内需要拦截的方法所对应的代码之前设 置有注解,所述系统包含:控制层处理模块210,用于在所述Control ler层110对所接收到的 用户请求进行处理的过程中,在程序执行到所述Controller层110内其之前设置有注解的 方法所对应的代码时,调用该注解的业务逻辑,以提取用户信息;以及服务层处理模块220, 用于在程序执行到所述Service层120内其之前设置有注解的方法所对应的代码时调用该 注解的业务逻辑,以记录日志参数,并将该日志参数与所述用户信息一同存储在日志存储 模块内。本发明基于注解定义切面,并对用户信息以及注解所标示的业务逻辑解析得到的 相关业务信息(即,日志参数)进行整合以形成操作日志,记录保存,以供分析统计使用。 [0035]具体而言,为了记录用户信息,可利用切面拦截Controller层里的相关方法,获得 用户信息保存在线程变量ThreadLocal内。在需要记日志的Service层的方法中,可通过切 面记录Service层内的方法所做的操作。关于Service层的Advice分为两种:一种是 AroundAdvice,即用来记录操作前后的变化。对于不便获得操作前状态的方法,可通过 After Ad vice来记录方法操作的参数。获取到日志详情后,可通过扩展的Logback的 JDBCAppeder将日志信息保存到数据库中。日志记录完成后,可通过Controller的After advice来清除线程变量ThreadLocal中记录。本发明在所述Control层内用注解标示需要记 录日志的方法,结合该注解相关的业务逻辑提取用户信息并存储的线程变量中;在Service 层内用注解标示需要记录日志的业务方法,结合注解参数及该注解相关的业务逻辑获取该 方法执行所导致的业务变更,之后对用户信息及业务变更进行整合以形成操作日志加以记 录保存。
[0036]以下对Control ler层及Service层内的注解及其业务逻辑进行详细介绍。
[0037] 1 )Controller 层内的注解 ORequestLoggable
[0038] 可采用注解ORequestLoggable来拦截的Controller层内的方法,即,可将该注解@ Reques tLoggab 1 e放置在需要拦截的方法之前,如下所示:
[0039] iReque s tLoggab1e
[0040] @RequestMapping("publishSubscribeltem")
[0041 ] iResponseBody
[0042] public Resu1tMsgBean Pub1ishSubscribe1tem(iRquestParam int albumld)
[0043] 在程序执行至该方法所对应的代码时,将调用并执行注解ORequestLoggable的业 务逻辑,以获得用户信息并将该用户信息保存在ThreadLocal内。该注解ORequestLoggable 的业务逻辑可用于指示所述用户请求内存储用户信息的字段并存储该字段内的用户信息。 该注解ORequestLoggable的业务逻辑代码可如下所示,其内指明了用户请求内存储用户信 息的字段。 @Target(ElementType./WFTHOO) @ Ret e n t i o n (Re tent jo n Pol i cy-RUNTIME)
[0044] public (?interface RequestLoggable { Class userinfoClass () default UserinfoServicelmpl.class; }
[0045] 2)Service层内的注解
[0046] 2 ? 1注解 OAroundLoggable
[0047] 该注解OAroundLoggable用于注解需要Around advice拦截的Service层的方法, 艮P,可将该注解(MroundLoggable放置在需要拦截的方法之前,如下所示:
[0048] iAroundLoggabl e (type = OperationTypeEnum.INSERT,targetClass = ZtdiySubject.class)
[0049] iOverride
[0050] public void addZtdiySubject(ZtdiySubject ztdiySubject,int copyFromld, Boolean sync)throws SQLException
[OO51 ] 在程序执行至该方法所对应的代码时,将调用并执行注解(MroundLoggable的业 务逻辑。该注解(MroundLoggable的业务逻辑可用于记录该方法的执行所导致的参数变化。 该注解(MroundLoggable的业务逻辑代码可如下所示,其需要两个参数:1)日志对象class, 即targetClass;以及2)操作类型,即,OpereteTypeEnum中的枚举值。 @Target(ElementType./WfWOD) @Retention(RetentionPolicy,/?(7A/7/Mi:5 public @interface AroundLoggable {
[0052] OperationTypeEnum type〇 default QperationTypeEnum.tyPD47'£'; Class targetClass(); }
[0053] 2 ? 2注解 @Af terLoggable
[0054] 该注解@AfterLoggable用于注解不便获取操作前状态的Service层的方法,即,可 将该注解?AroundLoggable放置在需要拦截的方法之前,如下所示:
[0055] @Af terLoggable(type = OperationTypeEnum .DELETE,targetClass = SubscribeRuleContent.class)
[0056] ?Override
[0057] public void deleteSubscribeByAlbumld(@ModifyParam(isPK = ture, paramName=',albumld")int albumld)
[0058] 在程序执行至该方法所对应的代码时,将调用并执行注解?AfterLoggable的业务 逻辑。该注解@Af terLoggable的业务逻辑可用于记录该方法的执行所操作的参数。该注解@ Af terLoggable的业务逻辑代码可如下所示,其必须配合使用注解?ModifyParam来提供日 志信息。 #Tafgei:(Elernent丁ype.M£TWG£)) @Retention(RetentionPolicy,/?(7A/777Wf) Public (^interface AfterLoggable {
[0059] OperationTypeEnum type{) default OperationTypeEnum. Class targetClass{); }
[0060] 2 ? 3注解?ModifyParam
[0061 ] 该注解?ModifyParam用于提供用于注解?AfterLoggable的日志信息,其配合上述 注解?AfterLoggable而被使用,具体使用方式如下所示:
[0062] @AfterLoggable{1?/pe=DperatranTypeEnum.OElFrE/ targetClass=SubsGribeRuleContentxlass) ?Override public void deletGSubseribeByAibum|d(#ModifyParam(i$PK^^ paramName^alburnld^) int albumld) { subscribeCententDao,deleteSubsGribeByAIburnid(albumicl]; }
[0063] 该注解麵odifyParam的业务逻辑可用于指示所需记录的字段以及该字段之间的 关系(例如,哪一字段为主键字段和/或哪些字段之间为父子关系),其业务逻辑代码可如下 所示:
[0064] ?TargetfElementType.PA/WMfTfff) @Retention(RetenttonPolicy./?(iWr//W£) public (?interface ModifyParam { String paramNarne() default/w; boolean isPK〇 default false; String pkFieldO default m,'JJ if the param is a obj? get the pk val using assigned pkField }
[0065] 其中参数paramName是参数的名称,isPk指明此参数是否是主键,pkField用来指 明当参数为object时,主键的字段名称。
[0066]为了从日志对象中获取日志信息,还需要一些用于字段的注解,如下所示:
[0067] 1)注解?UnMonitorField,用于标示此字段不需要记日志
[0068] 2)注解?PKField,用于标示此字段为主键字段
[0069] 3)注解?PIDField,用于标示有父子关系的父对象,此字段为PID
[0070] 4)注解?SublDField,用于标示有父子关系的子对象,此字段为SubID上述用于字 段的注解的使用方式如下所示:
[0071] ?Entity
[0072] ?Table(name =" CMS-SUBSCRIBE-CONTENT")
[0073] public class SubscribeRuleContent implements Serializable{
[0074] private static final long serialVersionUID=-2929087382057975094L;
[0075] OPKField
[0076] ?SublDField
[0077] private int id;
[0078] private int category;
[0079] OPIDField
[0080] private int albumld;
[0081] private String albumName;
[0082] private float currentEpisode;
[0083] private int playStatus;//更新状态
[0084] private Inter updateType;//l每天2每周3隔周4指定日期
[0085] private float cycleEpisodes;
[0086] private String beginTime;
[0087] private String endTime;
[0088] private Timestamp ctime;
[0089] private Timestamp mtime;
[0090] private String indicateDate;
[0091] private String updateDay;
[0092] private String playtime;
[0093] private int indicate_playtime;
[0094] iUnMonitorField
[0095] private String releDesc;
[0096] iUnMonitorField
[0097] private String scope;
[0098] iUnMonitorField
[0099] private int no;//序号
[0100] 综上而言,注解OAroundLoggable的使用需要进行以下设置:
[0101 ] 1)使用ORequestLoggable注解相应的Controller层内的方法;
[0102] 2)使用OAroundLoggable注解相应的Service层内的方法;以及
[0103] 3)使用 @UnMonitrFiled,@PKField,@PIDField,@SubIDField 注解相关对象的字 段。
[01 04] 注解@Af terLoggab 1 e的使用需要进行以下设置:
[0105] 1)使用ORequestLoggable注解相应的Controller层内的方法;
[0106] 2)使用OAfterLoggable注解相应的Service层内的方法;以及
[0107] 3)使用iModifyLoggable注解相应的Service层内的方法的参数。
[0108] 图2为本发明提供的基于MVC架构的日志记录方法的流程图。如图2所示,相应地, 本发明还提供一种基于MVC架构的日志记录方法,所述MVC架构包含Control ler层及 Service层,所述Control ler层接收用户请求,并根据该用户请求执行该Control ler层内的 方法,该Control ler层的方法通过调用所述Service层内的方法而被执行,其中在所述 Control ler层及Service层内需要拦截的方法所对应的代码之前设置有注解,所述方法包 含:在所述Controller层对所接收到的用户请求进行处理的过程中,在程序执行到所述 Controller层内其之前设置有注解的方法所对应的代码时,调用该注解的业务逻辑,以提 取用户信息;以及在程序执行到所述Service层内其之前设置有注解的方法所对应的代码 时,调用该注解的业务逻辑,以记录日志参数,并将该日志参数与所述用户信息一同存储在 日志存储模块内。有关该方法的细节及益处与上述日志记录系统的相同,于此不再赘述。
[0109] 本发明通过在注解标识在相关程序代码中(即,控制层及服务层内需要拦截的方 法之前),通过切面拦截注解,并调用该注解的业务逻辑将应该被记录的日志参数记录下 来,并将该日志参数与用户信息一同存储在日志存储模块内。本发明在不改变源程序代码 的基础上,只需要添加一些注解,即可完成日志信息的记录,而且所记录的信息远比切面丰 富。另外,不同的需要记录日志的系统的数据结构会不一样,而通过本发明,只需要对注解 的业务逻辑进行相应地调整,便可使得本系统适应于不同的需要记录日志的系统,这样极 大地提高了本发明的可扩展性,可适应于各种不同的需要记录日志的系统。
[0110]以上结合附图详细描述了本发明的优选实施方式,但是,本发明并不限于上述实 施方式中的具体细节,在本发明的技术构思范围内,可以对本发明的技术方案进行多种简 单变型,这些简单变型均属于本发明的保护范围。
[0111] 另外需要说明的是,在上述【具体实施方式】中所描述的各个具体技术特征,在不矛 盾的情况下,可以通过任何合适的方式进行组合。为了避免不必要的重复,本发明对各种可 能的组合方式不再另行说明。
[0112] 此外,本发明的各种不同的实施方式之间也可以进行任意组合,只要其不违背本 发明的思想,其同样应当视为本发明所公开的内容。
【主权项】
1. 一种基于MVC架构的日志记录系统,所述MVC架构包含控制层及服务层,所述控制层 接收用户请求,并根据该用户请求执行该控制层内的方法,该控制层的方法通过调用所述 服务层内的方法而被执行,其特征在于,在所述控制层及服务层内需要拦截的方法所对应 的代码之前设置有注解,所述系统包含: 控制层处理模块,用于在所述控制层对所接收到的用户请求进行处理的过程中,在程 序执行到所述控制层内其之前设置有注解的方法所对应的代码时,调用该注解的业务逻 辑,以提取用户信息;以及 服务层处理模块,用于在程序执行到所述服务层内其之前设置有注解的方法所对应的 代码时,调用该注解的业务逻辑,以记录日志参数,并将该日志参数与所述用户信息一同存 储在日志存储模块内。2. 根据权利要求1所述的日志记录系统,其特征在于,所述控制层内的方法所对应的代 码之前所设置的注解的业务逻辑用于指示所述用户请求内存储用户信息的字段并存储该 字段内的用户信息。3. 根据权利要求1或2所述的日志记录系统,其特征在于,所述服务层内的方法所对应 的代码之前所设置的注解的业务逻辑用于记录该方法的执行所导致的参数变化。4. 根据权利要求1或2所述的日志记录系统,其特征在于,所述服务层内的方法所对应 的代码之前所设置的注解的业务逻辑用于记录该方法的执行所操作的参数。5. 根据权利要求4所述的日志记录系统,其特征在于,所述用于记录所述方法的执行所 操作的参数的注解的业务逻辑内还含有一注解,该注解的业务逻辑用于指示所需记录的字 段以及所述字段之间的关系。6. 根据权利要求5所述的日志记录系统,其特征在于,所述字段之间的关系包含哪一字 段为主键字段和/或哪些字段之间为父子关系。7. -种基于MVC架构的日志记录方法,所述MVC架构包含控制层及服务层,所述控制层 接收用户请求,并根据该用户请求执行该控制层内的方法,该控制层的方法通过调用所述 服务层内的方法而被执行,其特征在于,在所述控制层及服务层内需要拦截的方法所对应 的代码之前设置有注解所述方法包含: 在所述控制层对所接收到的用户请求进行处理的过程中,在程序执行到所述控制层内 其之前设置有注解的方法所对应的代码时,调用该注解的业务逻辑,以提取用户信息;以及 在程序执行到所述服务层内其之前设置有注解的方法所对应的代码时,调用该注解的 业务逻辑,以记录日志参数,并将该日志参数与所述用户信息一同存储在日志存储模块内。8. 根据权利要求7所述的日志记录方法,其特征在于,所述控制层内的方法所对应的代 码之前所设置的注解的业务逻辑用于指示所述用户请求内存储用户信息的字段并存储该 字段内的用户信息。9. 根据权利要求7或8所述的日志记录方法,其特征在于,所述服务层内的方法所对应 的代码之前所设置的注解的业务逻辑用于记录该方法的执行所导致的参数变化。10. 根据权利要求7或8所述的日志记录方法,其特征在于,所述服务层内的方法所对应 的代码之前所设置的注解的业务逻辑用于记录该方法的执行所操作的参数。11. 根据权利要求10所述的日志记录方法,其特征在于,所述用于记录所述方法的执行 所操作的参数的注解的业务逻辑内还含有一注解,该注解的业务逻辑用于指示所需记录的 字段以及所述字段之间的关系。12.根据权利要求11所述的日志记录方法,其特征在于,所述字段之间的关系包含哪一 字段为主键字段和/或哪些字段之间为父子关系。
【文档编号】G06F9/445GK105893016SQ201510919783
【公开日】2016年8月24日
【申请日】2015年12月11日
【发明人】张鹏
【申请人】乐视网信息技术(北京)股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1