Logging 是儲存關於 ruby 程式運行資訊的過程,這對開發跟產品環境都是有幫助的,因為 logging 的重點是在搜集發生的事件,什麼錯了&什麼對了。所有的資訊都會被記錄下來,不論事 SQL 請求、錯誤訊息、request 的詳細資訊。有了這些訊息可以更快找到問題出在哪。
在 rails app 裡,logs 都是儲存在 /log
資料夾裡。在開發模式下, development.log 檔案會被使用,當看到 log 在終端機輸出表示 rails 伺服器正在啟動。
Ruby 的 Logger 類別讓使用者可以建立 logs 並且帶有預設輸出的格式、顯示不同等級的嚴重程度。如何 log 建立?
logger = Logger.new("my_log.txt")
這會把 logging 訊息寫進 my_log.txt 。如果想要在終端機顯示訊息,當程式運行的時候可以 log 到 STDOUT。
logger = Logger.new(STDOUT)
Logging 訊息可以有不同等級
DEBUG
INFO
WARN
ERROR
FATAL
UNKNOWN
每一個都有一個相應的實體方法,如果要 log “info”。
logger.info("I'm reading a RubyGuide about logging!")
看起來會像是這樣:
I, [2019-08-08T19:22:00.152079 #642] INFO -- : I'm reading a RubyGuide about logging!
這些不同的等級可以幫助你過濾 log 檔案,可以更快找到想要的訊息。這也可以讓使用者看到在整個過程裡面出現了多少錯誤跟警告訊息。
使用預設輸出的格式不是壞事,因為那是現成的工具、許多人也知道那是如何運作。
I, [2019-08-08T19:22:00.152079 #642] INFO -- : test
說明一下這裡的元件:
這裡的 “I” 代表每個等級的自首,“I” -> INFO
陣列裡可以看到時間、產生這個訊息的 process id (PID)
INFO 是等級的全名
最後才是實際上發生的訊息
並不是所有人都對這個格式很清楚,所以 ruby 可以改成這樣:
logger.formatter = proc { |severity, datetime, progname, msg| "#{severity}, #{datetime}, #{msg}\n" }
最後的結果會變成:
DEBUG, 2019-08-08 19:39:01 +0200, testing
這樣還可以增加額外的資訊。
如果有在注意 Logs 其實會慢慢變成很大的檔案,如果 logs 用完了硬碟空間,那就會有奇怪的事情在系統裡開始發生。解決方法是限制 logs 的大小
MEGABYTE = 1024 ** 2
ONE_HUNDRED_MEGABYTES = MEGABYTE * 100
logger = Logger.new("my_log.txt", 1, ONE_HUNDRED_MEGABYTES)
第一個參數是要把 log 儲存在哪
第二的參數想要保留多少個 log 檔案
最後一個參數是限制檔案的最大容量
如何閱讀以及如何找到你要的資訊? Logs 都是很簡單樸素的檔案,所以可以利用文字處理工具來閱讀,例如:Grep。 這是一個可以過濾訊息的工具。
grep INFO my_log.txt
可以透過 grep 搜尋資訊,把 “INFO” 替換成想要搜尋的資訊就可以了。