精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (6)
|
|
---|---|
作者 | 正文 |
发表时间:2011-08-02
freish 写道 日志记录到数据库,如果一天能跑出2G的日志,得多少条记录啊
说了,操作日志,一般也就是管理日志。你家管理员一天能操作出2G的日志? |
|
返回顶楼 | |
发表时间:2011-08-02
heweiya 写道 好不通用的一个“通用设计”呀!
我们也做一个通用日志,不过,以组件形式发布,叫留痕组件。 主要思想是在数据库驱动上做代理,也就是DriverSpy implements Driver,支持多种数据库。 在使用组件时,把数据库的驱动使用这个DrivereSpy就Okay了。 做日志的方式最好不用做到数据库里,哪样的压力比较大,我们采用做文本滚动日志,把每一次的操作使用JSON的方式记录下来(使用read/write锁,防止异步操作),主要是一些SQL的语法不同,害怕打乱其中的结构。 另外,我们还可以把更新前后的字段做一个比较,原理是在对Execute的时候,再做一次查询。 我们组件最重要的作用是回滚数据,虽然叫回滚,但其实就是先做一个Base line的数据样板,然后把每次操作的日志累加起来,形成某日某时的回滚数据。 同样了,根据JDK和JDBC3/JDBC4的不同,我们发布了针对JDBC3和JDBC4的版本。 呵呵。 一样,操作日志!如果你需要查询一个管理员的操作记录,你让客户去看sql语句或是json代码? |
|
返回顶楼 | |
发表时间:2011-08-02
heweiya 写道 好不通用的一个“通用设计”呀!
我们也做一个通用日志,不过,以组件形式发布,叫留痕组件。 主要思想是在数据库驱动上做代理,也就是DriverSpy implements Driver,支持多种数据库。 在使用组件时,把数据库的驱动使用这个DrivereSpy就Okay了。 做日志的方式最好不用做到数据库里,哪样的压力比较大,我们采用做文本滚动日志,把每一次的操作使用JSON的方式记录下来(使用read/write锁,防止异步操作),主要是一些SQL的语法不同,害怕打乱其中的结构。 另外,我们还可以把更新前后的字段做一个比较,原理是在对Execute的时候,再做一次查询。 我们组件最重要的作用是回滚数据,虽然叫回滚,但其实就是先做一个Base line的数据样板,然后把每次操作的日志累加起来,形成某日某时的回滚数据。 同样了,根据JDK和JDBC3/JDBC4的不同,我们发布了针对JDBC3和JDBC4的版本。 呵呵。 这种功能数据库本身就有吧。。。。 |
|
返回顶楼 | |
发表时间:2011-08-02
最后修改:2011-08-02
回复
引用 每次Update的时候,先做一次Query,有可行性吗?比如update table1 set age = 10, 一次更新成千上万条记录,你能通用的进行“更新前后字段”的比较吗?
这个需要从业务出发,也就是说,可以对业务表进行配置,决定是否留痕。 引用 这种功能数据库本身就有吧。。。。
做为组件的目的是不为特定数据库所限制,再说,数据库本身没有做日志的功能,就是oracle的快照,你也需要动手来做。 引用 一样,操作日志!如果你需要查询一个管理员的操作记录,你让客户去看sql语句或是json代码?
我们有一个定时操作的Job,决定一个空闲时间把JSON的日志存放在一个指定的数据库当中。 |
|
返回顶楼 | |
发表时间:2011-08-02
不行,真正好的日子信息,应该是这样:
某功能,某字段,原值,新值,某人操作,时间,备注... 你这个最多是个玩具 |
|
返回顶楼 | |
发表时间: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... |
|
返回顶楼 | |
发表时间:2011-08-02
我觉得需求如果是拦截sql,不如直接在数据库端做,拦截tcp解包,数据库trigger,或者用mysql binlog之类的分析。
但sql与业务并不是直接对应的,解析成本还是很高的。我发的是 管理员日志 这种操作日志,通过sql解析成本太高了,应用的领域不一样。 |
|
返回顶楼 | |
发表时间:2011-08-02
要是能转换成关系图或是类图看得就更清晰了.
|
|
返回顶楼 | |
发表时间:2011-08-02
记录数据多不是问题,但是日志并发峰值高的话,你怎么解决
|
|
返回顶楼 | |
发表时间:2011-08-02
最后修改:2011-08-02
csdxqzp 写道 记录数据多不是问题,但是日志并发峰值高的话,你怎么解决
插入过程可以使用队列,调用直接返回。实际入库由另外一个线程异步进行。 |
|
返回顶楼 | |