iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 21
1
自我挑戰組

今晚我想來點 Ruby on Rails 系列 第 21

<Day 21>如何使用 Logs 來追蹤事件跟錯誤訊息

Logging 是儲存關於 ruby 程式運行資訊的過程,這對開發跟產品環境都是有幫助的,因為 logging 的重點是在搜集發生的事件,什麼錯了&什麼對了。所有的資訊都會被記錄下來,不論事 SQL 請求、錯誤訊息、request 的詳細資訊。有了這些訊息可以更快找到問題出在哪。

在 rails app 裡,logs 都是儲存在 /log 資料夾裡。在開發模式下, development.log 檔案會被使用,當看到 log 在終端機輸出表示 rails 伺服器正在啟動。

Logger 類別

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 檔案,可以更快找到想要的訊息。這也可以讓使用者看到在整個過程裡面出現了多少錯誤跟警告訊息。

如何格式化 Logs

使用預設輸出的格式不是壞事,因為那是現成的工具、許多人也知道那是如何運作。

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

這樣還可以增加額外的資訊。

如何限制 Log 大小

如果有在注意 Logs 其實會慢慢變成很大的檔案,如果 logs 用完了硬碟空間,那就會有奇怪的事情在系統裡開始發生。解決方法是限制 logs 的大小

MEGABYTE = 1024 ** 2
ONE_HUNDRED_MEGABYTES = MEGABYTE * 100
logger = Logger.new("my_log.txt", 1, ONE_HUNDRED_MEGABYTES)

第一個參數是要把 log 儲存在哪
第二的參數想要保留多少個 log 檔案
最後一個參數是限制檔案的最大容量

Log 閱讀 & 過濾

如何閱讀以及如何找到你要的資訊? Logs 都是很簡單樸素的檔案,所以可以利用文字處理工具來閱讀,例如:Grep。 這是一個可以過濾訊息的工具。

grep INFO my_log.txt

可以透過 grep 搜尋資訊,把 “INFO” 替換成想要搜尋的資訊就可以了。


上一篇
<Day 20>什麼是 Yield & Yield_Self
下一篇
<Day 22>在 Ruby on Rails 什麼是 scaffold?
系列文
今晚我想來點 Ruby on Rails 30

尚未有邦友留言

立即登入留言