很多的管理后台为何安全考虑,往往会要求记录所有操作记录,以便与后期检查谁做了什么。
我们目前的系统后台就需要这样的功能,业务要求准确的记录每一个功能的使用情况。
于是在去年我就抽象出一个简单的组件 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: 审批工单
列表页面,可以按操作人、日期、动作类型来查询

单个记录详情界面
