[size=large] 首先说明,是在系统设计初期。
要记录系统中的操作日志,要求的粒度比较细,比如 用户 张三 取消了订单号为001的订单。 又比如:管理员审核通过李四的认证。 还有一个要求就是指定模块记录日志,有的要记,有的不记,还要可配。
开始的时候想过用aop去做日志的记录,可做demo的时候发现无法拦截到某个对象的变量值,比如订单的订单号;还有一个难处就是操作描述的内容拼接的问题,因为要记录的是各个模块中不同的操作,这个操作描述实在头疼。
我现在暂时的思路是就直接写一个接口,让需要记录日志的方法调用该接口去记录,描述让开发人员自己去拼,毕竟就算做到了通用的描述也会比较呆板。
各位有做过这块的指教一二[/size]
[quote] 我现在暂时的思路是就直接写一个接口,让需要记录日志的方法调用该接口去记录,描述让开发人员自己去拼,毕竟就算做到了通用的描述也会比较呆板。[/quote]
这个想法很好,我给你细化一下,你写个抽象类(或接口)
abstract class Log{
abstract private Date time();
abstract private String place();
abstract private String userid()
abstract private String event();
public String print(){
……这里是你的log记录操作,比如
log.info(userid()+"在"+time()+",在"+place()+"的操作是: "+event())
}
}
然后你懂的,不同的业务都继承Log,只需要覆盖abstract的方法,然后直接调用print方法就可以,既可以完成不同的要求,也可以统一格式。
在这里用抽象类比接口好,更加方便,基本上就是模版模式的运用。
我只说一句吧,spring aop只能对参数等等变量进行日志记录,但是本地变量(方法局域变量)是不行的。用aop没有任何办法。
自己写个拦截器,这样可以自己去拦截需要的路径记录日志。
要细粒度的记录日志,我想spring是无能为力了,因为日志可能深入在方法的各个角落,还是传统的将log4j塞到各个角落吧
你用接口的依据是什么,是重构,是方便?
接口不是为了方便,我实在找不出你必须用接口的原由。
而且你编写了接口了,还得编写处理接口的。
望lz做好了分享一下。
[quote]刚经理针对aop给了一个思路,将页面的变量在调用方法之前做一个拦截,将变量放到ThreadLocal中,在切面中拿出来,不知可行度如何[/quote]
有木有必要搞这么重量级哦。
还有我说的继承抽象类 不是说让你dao service来继承,而是每个业务模块独立一个类来继承,然后组合在你的dao service里面,所以不存在多继承的限制。
还有 你假如想做成接口,让dao,service来实现的话,你总得抽象出另外一个类来处理接口是吧,接口不是说你抽象出来就可以直接用的。
aop可以拿到参数的信息
[quote] 现在有一个难点就是模块可配置的问题,有的模块需要记录,有的不用,还要后期可配置。 [/quote]
你既然前面的搭出来了,这个应该简单了,大不了用配置文件,每个模块名字做外部标签,里面提供处理接口,假如没有的不配不就行咯。
[quote]可每个方法都要反射找包名,并发量大的话这性能问题... [/quote]
这个不是问题,你不可能每次用每次取,而是取一次放入内存里面。
其实完全可以自己扩展appender,让apeender可以细化到方法一级,就什么都搞定了。 :lol:
我觉得你可以写个方法调用的调度器。
所有的方法调用(或者说业务服务)都经过调度器。
然后扩展log4j 的记录,一般而言log4j 会提供线程号、类名、行号等信息,并可以配置。你可以实现自己的与业务有关的配置。比如user 信息。
在调度器中统一去记录日志。
利用扩展后的log4j,灵活的显示日志信息。
当然,关于你说的操作描述,可以枚举几个Action,然后将其封装,对外部隐藏,总比让程序员自己去描述要好得多
[quote]abstract class Log{
abstract private Date time();
abstract private String place();
abstract private String userid()
abstract private String event();
public String print(){
……这里是你的log记录操作,比如
log.info(userid()+"在"+time()+",在"+place()+"的操作是: "+event())
}
} [/quote]
弱弱的问一句:abstract 类中不能有private的抽象方法吧(抽象方法只能是public和protected)
针对这样的需求,可能采用事件架构比较好。 :lol: