公司想使用audited 用来作为审计,但是由于日积月累会导致 audits 表非常大。
定时删除此表以及此表的读写都对数据库性能有很大的影响。这个问题我在上家公司也遇到过表里有一亿数据,
运维小哥不知道备份一次就这一个表就有 25G 大,我写脚本删除的时候异常痛苦因为要分批删除,
还要尽量避免间隙锁。所以我和团队师兄商量一下决定采用 mongo 存储日志,
因为这个表只会创建和查询使用 mongo 还挺不错的,双数据库也可以不影响 mysql 主库的性能。
结果查了一下
audited
仅仅有一个版本很老的audited-mongo_mapper
版本,我们项目使用的是 mongoid所以我就照着
ActiveRecord
版本改了一个mongoid
版本的audited-mongoid,勉强能用了,有需要的可以试试看。按步骤创建好核心的模块文件之后,仅需要进行简单的引入就可以实现。
模型引入audited
后mongo
库中会自动创建一个集合model_audit_logs
,并设置了日志的保留时间 (需要在mongo
中建立索引后生效)
,建立索引后日志会在到期时自动删除,而无需像ActiveRecord
版本那样手动删除以减轻对mysql
的压力。
class Model < ActiveRecord::Base
MONGO_EXPIRE_AFTER_SECONDS = 30.days # mongo中日志保留时间
include Audited # 引入审计模块
audited # 调用审计初始化方法
end
监控所有字段 (不包含默认忽略字段,例如:created_at updated_at...)
audited
监控单一字段
audited only: :name
监控多个字段
audited only: [:name, :address]
监控除某些字段外的所有字段
audited except: :password
只需要稍作修改即可满足自定义的业务,比如自定义 action 名 (可以存入状态机event
+ 国际化即可完善审计日志)