{"id":13879294,"url":"https://github.com/rails-engine/audit-log","last_synced_at":"2025-04-05T02:10:38.511Z","repository":{"id":41166871,"uuid":"188761021","full_name":"rails-engine/audit-log","owner":"rails-engine","description":"📑 Create audit logs into the database for user behaviors, including a web UI to query logs.","archived":false,"fork":false,"pushed_at":"2023-12-04T18:34:38.000Z","size":98,"stargazers_count":170,"open_issues_count":9,"forks_count":27,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-03-29T01:12:30.633Z","etag":null,"topics":["audit","engine","log","op-log","operation","rails"],"latest_commit_sha":null,"homepage":"","language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rails-engine.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG","contributing":null,"funding":null,"license":"MIT-LICENSE","code_of_conduct":null,"threat_model":null,"audit":"audit-log.gemspec","citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-05-27T02:55:13.000Z","updated_at":"2025-03-26T12:30:26.000Z","dependencies_parsed_at":"2024-10-30T07:24:42.253Z","dependency_job_id":null,"html_url":"https://github.com/rails-engine/audit-log","commit_stats":{"total_commits":30,"total_committers":1,"mean_commits":30.0,"dds":0.0,"last_synced_commit":"7fac678f007d9a7337a990f5ca7eb3d37351b477"},"previous_names":[],"tags_count":11,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rails-engine%2Faudit-log","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rails-engine%2Faudit-log/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rails-engine%2Faudit-log/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rails-engine%2Faudit-log/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rails-engine","download_url":"https://codeload.github.com/rails-engine/audit-log/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247276189,"owners_count":20912288,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["audit","engine","log","op-log","operation","rails"],"created_at":"2024-08-06T08:02:16.457Z","updated_at":"2025-04-05T02:10:38.495Z","avatar_url":"https://github.com/rails-engine.png","language":"Ruby","funding_links":[],"categories":["Ruby"],"sub_categories":[],"readme":"# AuditLog\n\n[![build](https://github.com/rails-engine/audit-log/actions/workflows/build.yml/badge.svg)](https://github.com/rails-engine/audit-log/actions/workflows/build.yml)\n\nTrail audit logs (Operation logs) into the database for user behaviors, including a Web UI to query logs.\n\n\u003e We used audit-log in our production environment more than 1 year, until now (2020.5.21), it's inserted about **20 million** log in our system.\n\n[中文介绍与使用说明](https://ruby-china.org/topics/39890)\n\n## Demo UI\n\nAudit log list:\n\n\u003cimg width=\"870\" src=\"https://user-images.githubusercontent.com/5518/58676735-e9570d80-838b-11e9-8ac0-6c5145b7fbb0.png\"\u003e\n\nDetail page:\n\n\u003cimg width=\"870\" src=\"https://user-images.githubusercontent.com/5518/58676737-e9570d80-838b-11e9-9292-63389b2d54cb.png\"\u003e\n\n\n## Installation\n\nAdd this line to your application's Gemfile:\n\n```ruby\ngem \"audit-log\"\n```\n\nAnd then execute:\n```bash\n$ bundle\n```\n\nGenerate files:\n\n```bash\n$ rails g audit_log:install\n```\n\n## Usage\n\nUse in controllers:\n\n```rb\nclass TicktsController \u003c ApplicationController\n  def index\n    audit! :list_ticket, nil\n  end\n\n  def create\n    if @ticket.save\n      audit! :create_ticket, @ticket, payload: ticket_params\n    else\n      render :new\n    end\n  end\n\n  def update\n    if @ticket.save\n      audit! :update_ticket, @ticket, payload: ticket_params\n    else\n      render :edit\n    end\n  end\n\n  def approve\n    if @ticket.approve\n      audit! :approve_ticket, @ticket, payload: ticket_params\n    end\n  end\n\n  def destroy\n    # store original attributes for destroy for keep values\n    audit! :delete_ticket, nil, @ticket.attributes\n  end\n\n  private\n\n    def ticket_params\n      params.required(:ticket).permit!(:title, :description, :status)\n    end\nend\n```\n\nIn models or other places:\n\n```rb\nAuditLog.audit!(:update_password, @user, payload: { ip: request.remote_ip })\nAuditLog.audit!(:sign_in, @user, payload: { ip: request.remote_ip })\nAuditLog.audit!(:create_address, nil, payload: params)\n```\n\nChange `config/routes.rb` to add Route:\n\n```rb\nRails.application.routes.draw do\n  authenticate :user, -\u003e (u) { u.admin? } do\n    mount AuditLog::Engine =\u003e \"/audit-log\"\n  end\nend\n```\n\nI18n for audit names, you need create a `config/locales/audit-log.zh-CN.yml`:\n\n```yml\nzh-CN:\n  audit_log:\n    action:\n      sign_in: 登录\n      update_password: 修改密码\n      create_address: 添加住址\n      list_ticket: 查看工单列表\n      create_ticket: 创建工单\n      update_ticket: 更新工单\n      delete_ticket: 删除工单\n      approve_ticket: 审批工单\n```\n\nFor track Warden (Devise) sign in behavirs:\n\nconfig/initializes/devise.rb\n\n```rb\nWarden::Manager.after_authentication do |user, auth, opts|\n  request = ActionDispatch::Request.new(auth.env)\n  AuditLog.audit!(:sign_in, user, payload: opts, user: user, request: request)\nend\n\nWarden::Manager.before_failure do |env, opts|\n  request = ActionDispatch::Request.new(env)\n  email = request.params.dig(:user, :email)\n  user = User.find_by_email(email)\n  opts[:email] = email\n  AuditLog.audit!(:sign_in_failure, nil, payload: opts, request: request, user: user)\nend\n```\n\n## Configuration\n\nYou can write a `config/initializers/audit_log.rb` to configure the behavior of audit log.\n\n```rb\nAuditLog.configure do\n  # class name of you User model, default: 'User'\n  self.user_class = \"User\"\n  # current_user method name in your Controller, default: 'current_user'\n  self.current_user_method = \"current_user\"\n  # Speical a table_name for AuditLog model, default: \"audit_logs\"\n  self.table_name = \"audit_logs\"\nend\n```\n\n## License\n\nThe gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frails-engine%2Faudit-log","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frails-engine%2Faudit-log","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frails-engine%2Faudit-log/lists"}