前言
追問題 (bug) 時,Log 是非常重要的訊息來源,能知道當時發生了什麼問題
像是使用者做了什麼操作、帶了哪些參數、request、response 的紀錄等
若都沒有儲存 Log 紀錄的話,就...好自為之 QQ
後續的文章會以此 repo 作為範例
如何產生 Log
使用者在操作時,本身就會產生制式 Log 被記錄,並存在 Log 資料夾底下,依照當下環境,存在對應的檔案中
在 development 操作的 Log
development 增加時間戳
上面那張圖雖然有自動存成 Log,但沒時間戳挺不方便的
增加方法如下,或參考此 commit
備註: production 預設就有記錄時間戳 (config/environments/production.rb
),故不用調整,而 development 則依需求是否需要增加
1
2
3# config/environments/development.rb
config.log_formatter = ::Logger::Formatter.new
增加時間戳的 Log
如何在指定位置增加 Log
情境: 打 API 的 request 和 response 建議可以儲存,以及針對錯誤訊息也要記錄,方便後續追蹤
示範如何紀錄,可參考此 commit
1
2
3# app/controllers/users_controller.rb
Rails.logger.info "params: #{user_params}, #{@user.inspect}"
將 Log 存到指定路徑檔案中
將所有 Log 都存在預設路徑檔案中,會導致原本的檔案過於肥大,且要尋找時會比較麻煩,可依需求分類存在不同檔案中,像是打 A API 的統一存在 A 路徑,B API 的統一存在 B 路徑中...
範例可參考此 commit
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25# app/services/file_log.rb
# 有不同寫法,歡迎在底下留言交流
class FileLog
@loggers ||= {}
def self.logger(location)
@loggers[location] ||= create_logger(location)
end
def self.create_logger(location)
if ENV['RAILS_LOG_TO_STDOUT']
logger = Logger.new(STDOUT)
logger.progname = File.basename(location, '.log')
logger.formatter = Rails.configuration.log_formatter
else
FileUtils.mkdir_p(Rails.root.join('log', File.dirname(location)))
logger = Logger.new(Rails.root.join('log', location))
logger.formatter = proc do |severity, datetime, _progname, msg|
"#{severity} [#{datetime.strftime('%Y-%m-%d %H:%M:%S.%6N')}]: #{msg}\n"
end
end
ActiveSupport::TaggedLogging.new(logger)
end
end
參考資料
小結
Log 可說是非常重要的小細節,也能客製化格式,Google 下便有相關資源可參考,除了上述範例使用到的 :info
外,還有 :debug
、 :warn
、 :error
、 :fatal
以及 :unknown
可以使用,差異可參考上述提供的參考資料連結
雖說很方便,但也不要過於氾濫什麼都儲存,除了會影響效能外,容量也會用很兇
鐵人賽文章連結:https://ithelp.ithome.com.tw/articles/10242280
medium 文章連結:https://link.medium.com/9T7n8giyZ9
本文同步發布於 小菜的 Blog https://riverye.com/
備註:之後文章修改更新,以個人部落格為主