关于细粒度系统操作日志记录问题

[size=large] 首先说明,是在系统设计初期。
要记录系统中的操作日志,要求的粒度比较细,比如 用户 张三 取消了订单号为001的订单。 又比如:管理员审核通过李四的认证。 还有一个要求就是指定模块记录日志,有的要记,有的不记,还要可配。
开始的时候想过用aop去做日志的记录,可做demo的时候发现无法拦截到某个对象的变量值,比如订单的订单号;还有一个难处就是操作描述的内容拼接的问题,因为要记录的是各个模块中不同的操作,这个操作描述实在头疼。
我现在暂时的思路是就直接写一个接口,让需要记录日志的方法调用该接口去记录,描述让开发人员自己去拼,毕竟就算做到了通用的描述也会比较呆板。
各位有做过这块的指教一二[/size]

13个回答

[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:

共13条数据 1 尾页
立即提问