iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 18
0
自我挑戰組

Ruby on Rails 與它們相關的東西系列 第 18

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

  • 分享至 

  • xImage
  •  

前言

追問題 (bug) 時,Log 是非常重要的訊息來源,能知道當時發生了什麼問題
像是使用者做了什麼操作、帶了哪些參數、request、response 的紀錄等
若都沒有儲存 Log 紀錄的話,就...好自為之 QQ

後續的文章會以此 repo 作為範例


如何產生 Log

使用者在操作時,本身就會產生制式 Log 被記錄,並存在 Log 資料夾底下,依照當下環境,存在對應的檔案中

在 development 操作的 Log

development 增加時間戳

上面那張圖雖然有自動存成 Log,但沒時間戳挺不方便的

增加方法如下,或參考此 commit

備註: production 預設就有記錄時間戳 (config/environments/production.rb),故不用調整,而 development 則依需求是否需要增加

# config/environments/development.rb

config.log_formatter = ::Logger::Formatter.new

增加時間戳的 Log

如何在指定位置增加 Log

情境: 打 API 的 request 和 response 建議可以儲存,以及針對錯誤訊息也要記錄,方便後續追蹤

示範如何紀錄,可參考此 commit

# app/controllers/users_controller.rb

Rails.logger.info "params: #{user_params}, #{@user.inspect}"

將 Log 存到指定路徑檔案中

將所有 Log 都存在預設路徑檔案中,會導致原本的檔案過於肥大,且要尋找時會比較麻煩,可依需求分類存在不同檔案中,像是打 A API 的統一存在 A 路徑,B API 的統一存在 B 路徑中...

範例可參考此 commit

# 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/

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


上一篇
Day17 - Ruby on Rails 中的 awesome_print 讓你的 console 更好閱讀
下一篇
Day19 - Ruby on Rails 測試篇 - RSpec
系列文
Ruby on Rails 與它們相關的東西31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言