论坛首页 Java企业应用论坛

通用操作日志系统设计。一次编写,所有项目共同使用!

浏览 25180 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (6)
作者 正文
   发表时间:2011-08-02  
freish 写道
日志记录到数据库,如果一天能跑出2G的日志,得多少条记录啊


说了,操作日志,一般也就是管理日志。你家管理员一天能操作出2G的日志?


0 请登录后投票
   发表时间:2011-08-02  
heweiya 写道
好不通用的一个“通用设计”呀!
我们也做一个通用日志,不过,以组件形式发布,叫留痕组件。
主要思想是在数据库驱动上做代理,也就是DriverSpy implements Driver,支持多种数据库。
在使用组件时,把数据库的驱动使用这个DrivereSpy就Okay了。

做日志的方式最好不用做到数据库里,哪样的压力比较大,我们采用做文本滚动日志,把每一次的操作使用JSON的方式记录下来(使用read/write锁,防止异步操作),主要是一些SQL的语法不同,害怕打乱其中的结构。

另外,我们还可以把更新前后的字段做一个比较,原理是在对Execute的时候,再做一次查询。

我们组件最重要的作用是回滚数据,虽然叫回滚,但其实就是先做一个Base line的数据样板,然后把每次操作的日志累加起来,形成某日某时的回滚数据。

同样了,根据JDK和JDBC3/JDBC4的不同,我们发布了针对JDBC3和JDBC4的版本。

呵呵。


一样,操作日志!如果你需要查询一个管理员的操作记录,你让客户去看sql语句或是json代码?
0 请登录后投票
   发表时间:2011-08-02  
heweiya 写道
好不通用的一个“通用设计”呀!
我们也做一个通用日志,不过,以组件形式发布,叫留痕组件。
主要思想是在数据库驱动上做代理,也就是DriverSpy implements Driver,支持多种数据库。
在使用组件时,把数据库的驱动使用这个DrivereSpy就Okay了。

做日志的方式最好不用做到数据库里,哪样的压力比较大,我们采用做文本滚动日志,把每一次的操作使用JSON的方式记录下来(使用read/write锁,防止异步操作),主要是一些SQL的语法不同,害怕打乱其中的结构。

另外,我们还可以把更新前后的字段做一个比较,原理是在对Execute的时候,再做一次查询。

我们组件最重要的作用是回滚数据,虽然叫回滚,但其实就是先做一个Base line的数据样板,然后把每次操作的日志累加起来,形成某日某时的回滚数据。

同样了,根据JDK和JDBC3/JDBC4的不同,我们发布了针对JDBC3和JDBC4的版本。

呵呵。


这种功能数据库本身就有吧。。。。
0 请登录后投票
   发表时间:2011-08-02   最后修改:2011-08-02
回复
引用
每次Update的时候,先做一次Query,有可行性吗?比如update table1 set age = 10, 一次更新成千上万条记录,你能通用的进行“更新前后字段”的比较吗?


这个需要从业务出发,也就是说,可以对业务表进行配置,决定是否留痕。

引用
这种功能数据库本身就有吧。。。。


做为组件的目的是不为特定数据库所限制,再说,数据库本身没有做日志的功能,就是oracle的快照,你也需要动手来做。

引用
一样,操作日志!如果你需要查询一个管理员的操作记录,你让客户去看sql语句或是json代码?


我们有一个定时操作的Job,决定一个空闲时间把JSON的日志存放在一个指定的数据库当中。
0 请登录后投票
   发表时间:2011-08-02  
不行,真正好的日子信息,应该是这样:

某功能,某字段,原值,新值,某人操作,时间,备注...

你这个最多是个玩具
0 请登录后投票
   发表时间:2011-08-02  
volking 写道
不行,真正好的日子信息,应该是这样:

某功能,某字段,原值,新值,某人操作,时间,备注...

你这个最多是个玩具


没错,大家的讨论从技术实现到业务领域里。

在业务里,我们做一个统一的接口,由第三方软件提功实现,用注入的方式,比如:
<params
		<param name="processorFactory" value="com.mycompany.sqltrace.ProcessorFactoryImpl" />		
</params>

而我们的要求的基本信息如下:
private String requestId;//生成java  uuid
private String serviceName;
private String serviceMethod;
private String userCode;
private String userName;
private String userIp;
private Long baseLine;
private String serviceCNName;


而记录的日志的形式如下:
private String traceId;
private Date operateTime;
private String operateStatus;//操作状态	I,U,D
private String sqlInfo;
private Long responseTime;//响应时间
private LogConfigTable logConfigTable;//对应的业务表
private AppRequestInfo appRequestInfo;//如上第三方提供的信息
private List<LogTraceAssistant> logTraceAssistants = new ArrayList<LogTraceAssistant>();//子表信息,对应的字段及beforeValue, afterValue, etc...

0 请登录后投票
   发表时间:2011-08-02  
我觉得需求如果是拦截sql,不如直接在数据库端做,拦截tcp解包,数据库trigger,或者用mysql binlog之类的分析。

但sql与业务并不是直接对应的,解析成本还是很高的。我发的是 管理员日志 这种操作日志,通过sql解析成本太高了,应用的领域不一样。


0 请登录后投票
   发表时间:2011-08-02  
要是能转换成关系图或是类图看得就更清晰了.
0 请登录后投票
   发表时间:2011-08-02  
记录数据多不是问题,但是日志并发峰值高的话,你怎么解决
0 请登录后投票
   发表时间:2011-08-02   最后修改:2011-08-02
csdxqzp 写道
记录数据多不是问题,但是日志并发峰值高的话,你怎么解决


插入过程可以使用队列,调用直接返回。实际入库由另外一个线程异步进行。

0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics