log
filed in Uncategorized on May.01, 2007
寫 log
在 rails 的程式裡隨時都可以做 logging:
logger.debug(”debug: current username is #{user.name}”)
“ ” 裡可以隨便放任何的資訊。 #{} 裡可放程式的變數,像使用者的名字 user.name,方便我們紀錄誰登入過。
Logging 有分五種不同的嚴重性。 從最輕微到最嚴重的排列如下:
debug: 除錯
info: 訊息
warn: 警告
error: 錯誤訊息
fatal: 嚴重錯誤
剛剛的例子就是除錯訊息的紀錄方法, 如要紀錄警告資訊的話,在程式裡寫:
logger.warn(”WARN: This transaction is irreversible”)

圖片裡顯示的是在一個 scaffold 產生出來的檔案 (list.rhtml) 裡寫入五個 logger。 每當使用者瀏覽 list.html 時,這五個訊息會被寫入 log 檔裡。
讀 log
紀錄起來的訊息可以在程式下的 log/ 目錄裡看到。如果在開發的模式下跑,所有的 log 會出現在 log/development.log。 在測試模式的話就會在 log/test.log。 在上線模式的話就會在 log/production.log。

每次寫新的 Rails 程式時,預設是在 development (開發) 模式下跑,所以啟動 伺服器後,log/development.log 裡有資料寫入了,其他的 test.log 和 production.log 目前是空白的。 Log/development.log 的內容如下:

要看 log 不用每次都把檔案打開。 伺服器的系統如是 U/linux 的話,可以用 tail 來即時顯示在螢幕上。 下面這個範例會把開發模式下的 log 顯示在螢幕上,一有新的紀錄就會顯示:
cd /myRailsApp/log tail -f development.log
設定那種類的 log 要紀錄
你也可以設定在那一種模式下要紀錄那種類的訊息。 例如,開發模式 (development) 的預設值是紀錄所有的 logger,我們如果覺得那太囉唆,只想紀錄比 info 還嚴重訊息,就把 /config/environments/development.rb 打開,把這行字加在最後面:
config.log_level = :info
加完後伺服器重開,網頁重整 (reload),去 log/development.log 裡就會看到新的 log:

新的 log 裡所紀錄的就沒包括 debug 的類型了。
那如果嚴重性 error 以下的都不要呢? 把剛剛的 config.log_level 那行改成
config.log_level = :error
重開 server 後,新的 log 就只有 error 跟 fatal 了:

大部份的人在開發環境裡會紀錄所有類型的 log,在上線環境裡才把 config.log_level 設成 :error,來紀錄比較嚴重的錯誤訊息。
不要紀錄敏感的資料
Rails 1.1.6 版本有新增一個可以不要紀錄敏感資料的功能。 敏感資料為密碼或信用卡號等等。 使用方法如下: 把工作中程式的 app/controllers/application.rb 打開,在
class ApplicationController < ActionController::Base
下面加一行
filter_parameter_logging "creditcard"
這就會叫 logger 不要紀錄變數名字裡有含 “creditcard” 這字串的資料,像 [customer][primary_creditcard] 跟 [customer][secondary_creditcard] 這兩個變數裡含的資料都不會被記下來。
更好的 logging 方法
Rails 用的 logger 是 ruby 內建的,雖然好用可是功能有點簡單。如要更好的話,就研究 log4r 看看。 log4r 目前跟 rails 的 benchmark 模組有衝突,所以先評估可不可用再細部研究。
如果 logger 已能滿足你的需求,深一步了解可到此頁
Leave a Reply