锁定老帖子 主题:無侵込式菂日志記錄
精华帖 (0) :: 良好帖 (19) :: 新手帖 (2) :: 隐藏帖 (18)
|
|
---|---|
作者 | 正文 |
发表时间:2009-11-06
相信大家茬頊目仲苚菂日志記彔都是基于AOP的方式吧。偶也是,用了spring提供的基于AspectJ的切面来完成的日志记录。但是日志记录的信息除记录时间外仅局限于记录类、方法、参数和返回值,提供不了多少有实用价值的业务信息。
大家一般是怎么记录业务信息的呢?直接在业务方法里调log的API?例如
log.info(userid+"录入一篇新的公文,公文id为:"+doc.id); 这样的话,业务和日志又绑定到一块去了。
偶后来所想的方法呀,是这样的,通过与类名相同的配置文件的方式来记录日志。 例如,可以在 com.xxx.businessobject.Business1.java的同级目录下,放置一个 com.xxx.businessobject.Business1.log.properties文件,文件内容为 addNewDoc=${user.id}插入了一个新的文档,文档id为${param[0].id} deleteDoc=${userid}删除了${result.num}个文档
其中${}里面的内容是类似于EL表达式的字符串,可以做几个简单的约定 ${user}:代表当前操作用户 ${user.id}:代表去当前操作用户的id属性 ${param[0]}:代表第1个参数 ${param[1].name}:代表第2个参数的name属性 ${this.book.id}:代表当前对象的book属性的id成员变量 ${result}:代表方法返回值 ${result.num}:代表返回值对象的num属性。
这样就可以对代码无侵入式的业务级的日志记录了
当然啦,如果求方便的话,是可以不使用配置文件的哦,大家都觉得配置文件已经够多了 偶觉得用Annotation的话,看起来效果会更好 例如这样子 @Log("插入了一个新文档${params[0].id}"); public void addNewDoc(Doc doc){ // }
这样做日志唯一不好的地方就是,没办法更细粒度的记录日志了,例如方法里的一些临时变量的信息之类 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-11-06
拜托,别用火星文
|
|
返回顶楼 | |
发表时间:2009-11-06
用注解和直接用log4j有啥区别?
|
|
返回顶楼 | |
发表时间:2009-11-06
egmacross 写道 用注解和直接用log4j有啥区别?
当然有区别咯,我可以在日志切面里随时替换日志的实现方式咯,用了log4j,就绑死log4j了哦,在osgi这种环境下,会出错的哦 |
|
返回顶楼 | |
发表时间:2009-11-06
听过slf4j吗,简单的替换就可以,再说了,就一个日志,绑定log4j又有什么不好的!!
|
|
返回顶楼 | |
发表时间:2009-11-06
kjj 写道 听过slf4j吗,简单的替换就可以,再说了,就一个日志,绑定log4j又有什么不好的!!
用过slf4j,顺带提一句,绑定log4j可是很麻烦滴哟。业务级日志,处理的方式不仅仅是输出到console或者是file或者存到db就算完事的哟。也许我需要对这些日志做其他处理呢?也许我需要发送到另外一个专门的日志服务器里呢? 不管怎么样,业务人员不应该关心日志的去向,或者说业务编写人员根本不需要知道有日志这个概念才对。 所以不应该在代码中出现日志的概念来。。。。 |
|
返回顶楼 | |
发表时间:2009-11-06
楼主的想法很不错。
如果能有办法支持本地化字符串,就更有趣了 |
|
返回顶楼 | |
发表时间:2009-11-06
这样的框架我做过,感觉一般般,主要是日志的内容不好收集,有些是运行时的,有些要记录多条日志在一个业务方法中,当然有些场景应用起来还是非常OK的,最好还提供一些APPDER的实现
|
|
返回顶楼 | |
发表时间:2009-11-06
那点“唯一”不好的地方,实在是太不好了。
|
|
返回顶楼 | |
发表时间:2009-11-07
shevliu 写道 拜托,别用火星文
是呀 真想找到 这火星文是根据什么 出来的 |
|
返回顶楼 | |