Gem AuditLog - 轻松构建审查日志 / 操作日志

huacnlee for Rails Engine Gem · 2020年05月21日 · 最后由 Qwaz1314 回复于 2020年11月07日 · 10745 次阅读
本帖已被管理员设置为精华贴

很多的管理后台为何安全考虑,往往会要求记录所有操作记录,以便与后期检查谁做了什么。

我们目前的系统后台就需要这样的功能,业务要求准确的记录每一个功能的使用情况。

于是在去年我就抽象出一个简单的组件 AuditLog 来实现这个功能。

AuditLog 截止目前,已经在我们系统中稳定运行了一年多,并持续记录了超过两千万条操作日志。

功能介绍

AuditLog 是一个 Rails Gem,可以让你在 Controller 里面通过 audit! 方法来实现记录用户动作,便于解决后期查询操作历史的需求。

https://github.com/rails-engine/audit-log

安装

往 Gemfile 新增

gem "audit-log"

使用

比如下面这个 Ticket 场景,分别在查阅列表、创建、更新、审核通过、删除等动作的时候,调用 audit! 方法,并传递相关参数来记录当时的情况。

class TicketsController < ApplicationController
  def index
    audit! :list_ticket, nil
  end

  def create
    if @ticket.save
      audit! :create_ticket, @ticket, payload: ticket_params
    else
      render :new
    end
  end

  def update
    if @ticket.save
      audit! :update_ticket, @ticket, payload: ticket_params
    else
      render :edit
    end
  end

  def approve
    if @ticket.approve
      audit! :approve_ticket, @ticket, payload: ticket_params
    end
  end

  def destroy
    # store original attributes for destroy for keep values
    audit! :delete_ticket, nil, @ticket.attributes
  end

  private

    def ticket_params
      params.required(:ticket).permit!(:title, :description, :status)
    end
end

除此此外,也可以在其他地方直接调用函数来记录:

AuditLog.audit!(:update_password, @user, payload: { ip: request.remote_ip })

你可以通过撰写 I18n 配置文件来对动作进行中文描述,增加 config/locales/audit-log.zh-CN.yml

zh-CN:
  audit_log:
    action:
      sign_in: 登录
      update_password: 修改密码
      create_address: 添加住址
      list_ticket: 查看工单列表
      create_ticket: 创建工单
      update_ticket: 更新工单
      delete_ticket: 删除工单
      approve_ticket: 审批工单

下面是我们系统的实际截图

列表页面,可以按操作人、日期、动作类型来查询

单个记录详情界面

项目地址

https://github.com/rails-engine/audit-log

哈哈,我写了一个 segment 版本的,把 audit_log 发给 segment,然后 segment 发给 OLAP

https://github.com/helloworld1812/active_record_segment

此外,collectiveidea 也有个不错的库

https://github.com/collectiveidea/audited

xiaoronglv 将本帖设为了精华贴。 05月21日 21:28

我觉得这一类的数据 在存储方面可以拓展一下。不一定非得传统数据库,S3,DynamoDB,Redshift 都可以考虑。 模糊搜索这个功能在数据量大的情况下,我觉得这个有点难为数据库了。

yakjuly 回复

S3、DynamoDB 这种架构复杂,不利于构建通用组件。这类需求实际上可以基于目前的方式在自己的项目中扩展。

实际上更简单的方式是将这个数据存储到非业务系统的库里面,比如我们的场景,Audit Log 是存储在后台特有的数据库里面,和业务系统隔离的。

这种需求是不是考虑自定义 logger,然后把 log 导入 es,用 kabana 做查询,既不用入侵业务代码,也方便开发查问题

太棒了,正需要这样的一个功能,想吃冰下雹子的感觉 👍 👍

膜拜,感谢华顺大佬的贡献

对于 monolithic 架构来说,可以想像这是一个非常方便的解决方案。在多服务的后端系统,audit log 最常见的还是通过 logging pipeline 来实现。比如先统一一个 audit log 的 format 让所有后端服务用统一的格式来产生 log,再通过 Logstash/Fluentd 类似的 log deamon 采集,经过一些处理最后把 audit log 跟其他的 service log 单独分开,存储到 s3,DynamoDB,etc。这套 Web UI 如果能单独部署,并且 point 到一个 redshift / dynamodb endpoint,也许会对更多人有用。

主要是思路,实现起来可以根据各自的实际情况,不是啥复杂的实现

你好,为什么我发不了帖子?

huacnlee 社区有人做过用户安全审计相关的吗 提及了此话题。 10月22日 20:47

这个思路好赞,学习分析软件的 xapi 也可以用这个来做的

hw676018683 回复

在 ruby 里面自定义 logger 么

需要 登录 后方可回复, 如果你还没有账号请 注册新账号