Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Ruby

การรักษาบันทึกของคุณจากการกลายเป็นระเบียบที่อ่านไม่ได้

เมื่อคุณพบจุดบกพร่องที่แปลกและดูเหมือนแก้ไม่ตก การปรับปรุงการบันทึกอาจเป็นขั้นตอนที่ดีที่สุดที่คุณสามารถทำได้ การบันทึกที่ยอดเยี่ยมเป็นวิธีที่ง่ายที่สุดในการตรวจหาและแก้ไขข้อบกพร่องทั้งคลาส เมื่อคุณบันทึกข้อมูลเพียงพอ คุณจะเห็นว่าข้อมูลของคุณเปลี่ยนแปลงไปอย่างไรในระหว่างการขอ คุณสามารถติดตามการโทรที่คุณโทรไปยังบริการอื่นๆ และตรวจสอบการตอบกลับ อันที่จริง เมื่อโปรแกรมแก้ไขข้อบกพร่องล้มเหลว การบันทึกช่วยฉันแก้ไขจุดบกพร่องที่ยากที่สุดเท่าที่ฉันเคยพบมา

แต่บันทึกมากเกินไป และไฟล์บันทึกของคุณจะกลายเป็นข้อความที่อ่านไม่ได้และไม่ช่วยเหลือกันอย่างรวดเร็ว คุณจะแบ่งเฉพาะข้อมูลที่คุณสนใจออกจากกองข้อมูลนั้นได้อย่างไร คุณสามารถพิมพ์ข้อความในลักษณะที่ง่ายต่อการกรองภายหลังได้หรือไม่

การทำเครื่องหมายข้อความบันทึกของคุณ

Rails มี TaggedLogging ซึ่งช่วยให้คุณจัดหมวดหมู่ข้อความบันทึกที่เกี่ยวข้องได้อย่างรวดเร็ว เมื่อคุณแท็กคนตัดไม้ คุณจะได้รับเครื่องหมายที่จุดเริ่มต้นของข้อความ ดังนั้นแทนที่จะเป็น:

Finding people...
  Person Load (0.3ms)  SELECT "people".* FROM "people"
Found 0 people!

คุณสามารถแท็กคนตัดไม้ Rails:

logger.tagged("People") do
  logger.debug "Finding people..."
  @people = Person.all
  logger.debug "Found #{@people.length} people!"
end

และคุณจะเห็นสิ่งนี้:

[People] Finding people...
[People]   Person Load (0.3ms)  SELECT "people".* FROM "people"
[People] Found 0 people!

ตอนนี้ บันทึกข้อความที่ใส่ใจเกี่ยวกับสิ่งต่าง ๆ สามารถ ดู ต่างกัน

ตัวอย่างเครื่องบันทึกที่ติดแท็ก

เมื่อคุณเข้าสู่ระบบบ่อยขึ้น และบันทึกสิ่งที่ซับซ้อนมากขึ้น คุณจะสังเกตเห็นพื้นที่ที่แท็กเหล่านั้นจะทำให้ข้อความของคุณชัดเจนขึ้นโดยธรรมชาติ แต่มีบางที่ที่ฉันพบว่าการบันทึกการแท็กมีประโยชน์อย่างยิ่ง ฉันมักจะแท็กสิ่งเหล่านั้นทันที

คุณสามารถบันทึกคำขอที่คุณทำกับ API อื่นๆ:

logger.tagged("GitHub API") do
  uri = URI("https://api.github.com/repos/rails/rails/tags")

  logger.info { "Fetching #{uri}" }
  tags = JSON.parse(Net::HTTP.get(uri))
  logger.info { "First tag: #{tags.first["name"]}" }
end
[GitHub API] Fetching https://api.github.com/repos/rails/rails/tags
[GitHub API] First tag: v4.2.4.rc1

ด้วยวิธีนี้ คุณสามารถดูได้อย่างง่ายดายว่าแอปกำลังพูดคุยกับ API นั้นอย่างไรและเมื่อใด

(วิธีนี้ใช้ได้ดีกับมิดเดิลแวร์ของ Faraday หรือหากคุณสื่อสารกับเซิร์ฟเวอร์ผ่านเกตเวย์เท่านั้น)

งานเบื้องหลังยังทำงานได้ดีกับการบันทึกที่แท็ก:

require "active_support/tagged_logging"

Resque.logger = ActiveSupport::TaggedLogging.new(Resque.logger)

module LoggedJob
  def around_perform_log_job(*args)
    logger.tagged(name) do
      logger.info { "Performing #{name} with #{args.inspect}" }
      yield
    end
  end
end

class MyJob
  extend LoggedJob

  def self.perform(*args)
    ...
  end
end

ตอนนี้ งานใดๆ ที่ขยาย LoggedJob จะมีข้อความบันทึกทั้งหมดที่แท็กด้วยชื่อคลาสของงาน

และถ้าคุณมีผู้ใช้ที่เข้าสู่ระบบ คุณสามารถแท็กข้อความด้วย ID ผู้ใช้ของพวกเขา:

logger.tagged(current_user_id ? "user-#{current_user_id}" : "user-anonymous") do
  logger.debug "Finding people..."
  @people = Person.all
  logger.debug "Found #{@people.length} people!"
end
[user-123] Finding people...
[user-123]   Person Load (0.3ms)  SELECT "people".* FROM "people"
[user-123] Found 0 people!

สุดท้าย หากคุณเพิ่มบรรทัดใน config/environments/production.rb (หรือ development.rb ) คุณสามารถให้ Rails ติดแท็กข้อความของคุณโดยอัตโนมัติ:

config.log_tags = [ :subdomain, :uuid ]

log_tags แสดงรายการแท็กที่คุณต้องการให้ปรากฏที่จุดเริ่มต้นของทุกรายการบันทึกของ Rails สัญลักษณ์แต่ละตัวอ้างอิงถึงวิธีการใน ActionDispatch::Request ดังนั้น :uuid หมายถึง request.uuid .

คุณยังสามารถส่ง Proc ที่รับ request วัตถุ:

config.log_tags = [ :subdomain, :uuid, lambda { |request| request.headers["User-Agent"] } ]

แต่ฉันไม่เห็นบ่อยนัก

แท็กเริ่มต้นเหล่านี้ดี:uuid สามารถเชื่อมโยงรายการบันทึกทั้งหมดที่เกิดขึ้นในคำขอเดียว และหากคุณเก็บเซสชันบนเซิร์ฟเวอร์ ID เซสชันก็มีประโยชน์เช่นกัน ด้วยแท็กเหล่านั้นและข้อความที่เพียงพอ คุณสามารถติดตามเส้นทางที่ซับซ้อนจริงๆ ผ่านแอปของคุณได้ และโดยปกติแล้ว นั่นคือสิ่งที่ต้องใช้เพื่อค้นหาว่าข้อผิดพลาดที่น่ารังเกียจเกิดขึ้นได้อย่างไร

คุณใช้ Rails logger ในแอปของคุณมากแค่ไหน? คุณได้ลองแท็กการบันทึกหรือไม่? หากคุณยังไม่มี ให้ลองหาที่สำหรับมัน การดำเนินการติดแท็กโดยผู้ใช้ของคุณเป็นการเริ่มต้นที่ดี มันจะช่วยคุณในครั้งต่อไปที่คุณต้องแก้ไขจุดบกพร่องแบบหลายขั้นตอนที่บ้าคลั่ง

หากคุณต้องการเรียนรู้เพิ่มเติมเกี่ยวกับการบันทึกและเทคนิคการดีบักอื่นๆ ฉันได้ทุ่มเททั้งบทของ Practicing Rails เพื่อค้นหาและแก้ไขข้อผิดพลาดที่คุณจะพบขณะสร้างแอป รับบทแรกได้ฟรีที่นี่