你必須很努力

Day18 - Ruby on Rails 中的 Logger 紀錄的介紹與應用

2020/09/23
字數統計: 680閱讀時間: 2 min

前言

追問題 (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

參考資料

  1. 除錯Rails 應用程式— Ruby on Rails 指南
  2. Ruby on Rails 實戰聖經#整理 Log 檔案

小結

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/

備註:之後文章修改更新,以個人部落格為主

原文連結:https://riverye.com/2020/09/23/Day18-Ruby-on-Rails-中的-Logger-紀錄的介紹與應用/

發表日期:2020-09-23

更新日期:2020-09-23

CATALOG
  1. 1. 前言
  2. 2. 如何產生 Log
    1. 2.0.1. 在 development 操作的 Log
  • 3. development 增加時間戳
    1. 3.0.1. 增加時間戳的 Log
  • 4. 如何在指定位置增加 Log
  • 5. 將 Log 存到指定路徑檔案中
  • 6. 參考資料
  • 7. 小結