如何记录创建操作?

时间:2011-06-23 05:45:49

标签: ruby-on-rails

我正在尝试在我的RoR应用程序上创建一个日志记录功能,记录用户在模型中给定控制器上执行的所有操作。我尝试使用过滤器实现它,但它们没有解决我的问题,因为它们不允许我正确记录“创建”操作。

“创建”操作很棘手,因为当调用前/后过滤器时操作尚未保存,因此,我没有相应的模型ID(我需要)。

我知道我可以使用“after_commit”,但这会大大增加日志记录功能的复杂性,因为每个日志条目中保存的“参数”都会暴露给控制器,而不会暴露给模型。

有没有办法动态地将“after_commit”过滤器添加到ActiveRecord的实例?

2 个答案:

答案 0 :(得分:0)

阅读本文,我认为这是一个很好的解决方案:Notifications

答案 1 :(得分:0)

这就是我记录的方式,我有一个用户控制器创建这样的动作:

def create
    @user = User.new(params[:user])
    if @user.save
        flash[:notice] = "Welcome, #{@user.username}"
        redirect_to(:controller => "users", :action => "home")
        session[:id] = @user.id
    else
        render("home")
    end
end

现在我想记录用户的创建,然后我这样做:
首先在User.rb(model)中创建一个AuditLogger类:

class User < ActiveRecord::Base
    ...some stuff other....
    class AuditLogger < Logger
       def format_message(severity, timestamp, progname, msg)
       "#{timestamp.to_formatted_s(:db)} #{severity} #{msg}\n"
    end 
end

然后回到控制器(users.rb)

def create
    @user = User.new(params[:user])
    if @user.save
        logfile = File.open("#{Rails.root}/log/my_log.log", 'a')    
        audit_log = AuditLogger.new(logfile)
        audit_log.info "#{@user.firstname} was created successfully"
        redirect_to(:controller => "users", :action => "home")
    else
        render("home")
    end
end

此外,您还需要在日志目录中创建名为my_log.log的文件。希望它应该能够记录。我知道它不是最好的解决方案,而且我有更好的方法,但当时我需要紧急工作,所以我坚持下去。

查看这些链接:
rails logging tips
alternative logging solution