问题的产生,必有其理由。说白点也就是客户需要,没办法的事。不过也到给我们添了不少麻烦。本人也希望大牛们能给在下提提更多的思路,在下在此谢过。
具体是这样:
1.要记录操作人员,操作时间,操作相应模块
2.要记录操作的原始数据(ps:列级别)和变更后数据
面临问题:
1.各个方法相对独立,没有公共接口
2.形参顺序不一,类型不一以及方法名称不一
针对以上,要是解决其实也很简单,主要不怕麻烦。写个接口,每个模块去调用,这种简单而且有效的方法。不过模块太多而且繁琐这要累死个人。
目前就我自己发现以及朋友提醒再加上资料等信息,大致将其分为2类,共四种方法:
第一类(每个相关业务中需要手工添加执行功能部分):
1.写日志操作类,在相关模块中添加此接口调用。这种方法比较简单,如果一开始就有这部分代码,那就更好解决了。此种方法自不必多说,跟正常接口一样。
2.利用消息中间件,2和1实现类似,也需要每次都调用jms,不过论性能2比1好点
3.利用log4j日志记录,相关请看:http://blog.csdn.net/ziruobing/article/details/3919501,logback也有相关
第二类(使用Aop,**等):
1.Aop,该实现思路@BussAnnotation注解可以标示相关业务信息(ps:新增,删除,修改等操作,以及所属模块等信息,aop中形参ProceedingJoinPoint可以获取参数对象
@Component("userManager")
public class UserManagerApplogicImpl implements UserManagerApplogic {
@BussAnnotation(moduleName="人员管理",option="添加用户")
public void addUser(String name) {
System.out.println("add a User!Name is "+name);
}
}
@Aspect
@Component
public class LogInterceptor {
@Pointcut("execution(public * com.mlliud..*.addUser(..))")
public void aApplogic() {}
@Around(value = "aApplogic() && @annotation(annotation) &&args(object,..) ", argNames = "annotation,object")
public Object interceptorApplogic(ProceedingJoinPoint pj,BussAnnotation annotation, Object object) throws Throwable {
System.out.println("moduleName:"+annotation.moduleName());
System.out.println("option:"+annotation.option());
pj.proceed();
return object;
}
}
2.**,这个简单日志还好,其他目测算了吧。个人愚笨只有想到根据访问链接记录一些日志。
看来以上问题,针对我们项目做分析。得出一下结论:
1.第一类在项目初期考虑或者有相关需求还好,涉及每个模块相关代码都要改,可以手工加入。要是项目结构复杂或者代码量较多,我觉得很坑.....
2.第二类aop中@BussAnnotation注解虽然可以标示些关键信息,但是我们毕竟要把整个vo的相关变更信息记录。由于当时参数没有特殊规范,以及类型没有规划,造成ProceedingJoinPoint获取参数没有规律可寻,例如:addUser(User u,int a),updateUser(User u,String x) 这种我获取第一个参数,往数据库中存就可以。其他你懂的....
3.**....
写此篇文章希望各位大神能给咱提下想法,寻找更好方法....
也希望在此宣传下群:189770377 希望各位大神能够入住,多多提出好的想法。也希望学弟学妹们,能够在此得到好的方向.
原标题:工作中面临日志问题以及自己现有日志的备份
关键词: