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