gpt4 book ai didi

ruby-on-rails - 如何将特定事件从 Rails 记录到日志文件?

转载 作者:太空宇宙 更新时间:2023-11-03 16:07:19 25 4
gpt4 key购买 nike

要求

我想保留特定事件的审计日志,例如:

  • 用户登录成功
  • 用户无法登录(原因:密码错误、未确认等)
  • super 用户修改了另一个用户的详细信息(以及他们所做的更改)
  • 等等

此日志应包含以下详细信息:

  • 执行操作的登录用户(基于 Controller 的current_user)
  • 被修改的记录(如 super 用户的其他用户记录)
  • 请求该操作的 IP 地址

此日志还应存储在文件系统的文件中,而不是数据库表中,以便稍后可以由机器上的其他服务获取。

一些可能性

以下是我目前考虑过的方法的简短列表:

ActiveRecord::观察者

观察者提供了一种很好的分离方式来观察这些特定事件。
然后我可以让观察者附加到一个日志文件,但我不确定我能够多么容易地获得这样一个调用的结果(例如登录失败或工作)并且我需要以某种方式调用 Controller 方法current_user找出登录的用户并获取获取IP地址的HTTP请求。

审计 gem(如 audited、auditable、paper_trail 等)

这些 gem 很方便知道如何为当前用户和 IP 地址访问 Controller ,但它们都记录到数据库中的审计表。 Auditable 特别好,因为它可以审计对象上的任何方法调用,而不仅仅是 AR 回调,但我可能需要修补它以写入文件而不是数据库......或者什么?

ActiveSupport::通知

我仍然需要阅读此内容,但我相信它提供了一种低级别的方式来订阅 Rails 中的低级别事件。对于这种情况,这可能太低级了,但我需要进一步调查。

Log4r

看起来这会成为一个不错的日志文件,但我不认为它有任何监视事件的方法。这只是问题的一部分。

有什么建议吗?

是否有执行此操作的最佳实践方法?您能否推荐从以前的经验中吸取的任何宝贵经验或教训?还有什么我应该考虑的吗?

最佳答案

感谢大家的回复。
Casper,我确实决定构建一些自定义的东西。

无论如何,我明白你写到本地数据库的意思,但这个项目的要求是转储日志文件,以便更精细的日志解析服务可以查询文件,甚至将它们与来自其他来源的信息结合起来。

为了从模型和 Controller 中获取日志记录,我最终制作了一个模块,我将同时包含在观察器和 ApplicationController 中。

模块看起来有点像这样:

module MyEventLogger
mattr_accessor :logged_current_user
mattr_accessor :logged_remote_ip

def log_event(message)
@@logger ||= Logger.new(Rails.root.join('log', 'audit.log'))
@@logger.info "#{Time.now} | #{logged_current_user}@#{logged_remote_ip} | #{message}"
end

def logged_current_user
@@logged_current_user || "SYSTEM"
end

def logged_remote_ip
@@logged_remote_ip || "NO IP ADDRESS"
end
end

ApplicationController 将具有:

include MyEventLogger
before_filter :setup_logger

...

def setup_logger
MyEventLogger.logged_current_user = current_user
MyEventLogger.logged_ip_address = request.remote_ip
end

观察者只需include MyEventLogger,它就可以访问log_event 方法以及当前用户和IP 地址。例如:

class UserObserver < ActiveRecord::Observer
include MyEventLogger

def after_save(user)
log_event "The User #{user} was saved by #{logged_current_user}"
end

end

关于ruby-on-rails - 如何将特定事件从 Rails 记录到日志文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10907775/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com