2011-08-29 25 views
5

我目前正在嘗試爲我的rails應用程序的管理部分實現日誌。這將允許管理員查看用戶執行什麼操作以及何時執行操作。例如,「用戶添加了新地址」,「用戶將他們的郵編從X更新爲Y」。由於每個動作都可能涉及許多模型,而不僅僅是用戶,所以我製作了一個日誌模型,其中包含所有其他系統模型ID,消息和日誌代碼的字段。在rails中保存用戶事件的日誌

class CreateLogs < ActiveRecord::Migration 
    def self.up 
    create_table :logs do |t| 
     t.integer :user_id 
     t.integer :marker_id 
     t.integer :administrator_id 
     t.integer :group_id 
     t.integer :assignment_id 
     t.integer :submission_id 
     t.integer :code 
     t.text :message 

     t.timestamps 
    end 
    end 

    def self.down 
    drop_table :logs 
    end 
end 

我擔心的是,例如,一個用戶可以(比方說)的分配添加到他們的帳戶,它被記錄爲

Log.create(:user_id => current_user.id, :assignment_id => the_assignment.id, :code => 342, :message => '') 

(某處代碼342對應於「用戶創造了一個新地址',因此不需要消息)

顯然,在日誌視圖中,我可以從日誌ID /細節中提取相關的用戶和地址信息,但如果要刪除此用戶或地址,則所有信息都會不可用,所以通過日誌回顧,入口將是基本的你沒用。

必須有更好的方法或者已經存在的東西來幫助記錄這樣的系統事件並應對潛在的刪除。

或者,我可以將整個條目作爲文本消息存儲,但不會非常糟糕,並且不必要地填充數據庫?

讓我知道如果有任何不清楚,只是計算日誌記錄應用程序的行動/事件必須已經完成!

感謝,

皮特

回答

3

看看上ActiveRecord Versioning列出的寶石,它可能是你所需要的。

+0

這看起來很有前途,特別像外觀紙質的痕跡,但它只能保存一個版本/日誌,當模型改變的權利? 如果我想單獨手動指定每個更改,該怎麼辦?或者,如果執行的操作不一定會更改模型,而是執行其他操作,比如發送電子郵件? –

+0

是的,版本控制/審計通常僅由記錄更改觸發。如果您需要記錄不一定觸發數據庫更改的自定義操作,則需要創建自己的記錄器。 – eugen

1

我認爲你打了一個很好的解決方案,使用原始文本而不是(或除了)的ID。如果您要存儲用戶名和地址,則可能不會破壞任何存儲容量。這幾乎是一個日誌文件如何做到這一點;它吐出誰做了什麼,什麼時候發生。我不認爲這會妨礙你的數據庫存儲一些額外的數據在文本中。但是,如果它確實很大,你可以隨時保留最近幾周的原木。也許有某種工作可以清除超過4周的任何日誌文件。但是,這主要取決於你在做什麼的日誌記錄級別:如果你記錄用戶所做的每一個動作,那麼這會變得非常大。如果你只對關鍵事件感興趣(用戶登錄/註銷,創建/更新/刪除某些東西等),那麼我認爲你很好地存儲文本並每隔一段時間清理一次。