เมื่อคุณพบจุดบกพร่องที่แปลกและดูเหมือนแก้ไม่ตก การปรับปรุงการบันทึกอาจเป็นขั้นตอนที่ดีที่สุดที่คุณสามารถทำได้ การบันทึกที่ยอดเยี่ยมเป็นวิธีที่ง่ายที่สุดในการตรวจหาและแก้ไขข้อบกพร่องทั้งคลาส เมื่อคุณบันทึกข้อมูลเพียงพอ คุณจะเห็นว่าข้อมูลของคุณเปลี่ยนแปลงไปอย่างไรในระหว่างการขอ คุณสามารถติดตามการโทรที่คุณโทรไปยังบริการอื่นๆ และตรวจสอบการตอบกลับ อันที่จริง เมื่อโปรแกรมแก้ไขข้อบกพร่องล้มเหลว การบันทึกช่วยฉันแก้ไขจุดบกพร่องที่ยากที่สุดเท่าที่ฉันเคยพบมา
แต่บันทึกมากเกินไป และไฟล์บันทึกของคุณจะกลายเป็นข้อความที่อ่านไม่ได้และไม่ช่วยเหลือกันอย่างรวดเร็ว คุณจะแบ่งเฉพาะข้อมูลที่คุณสนใจออกจากกองข้อมูลนั้นได้อย่างไร คุณสามารถพิมพ์ข้อความในลักษณะที่ง่ายต่อการกรองภายหลังได้หรือไม่
การทำเครื่องหมายข้อความบันทึกของคุณ
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 เพื่อค้นหาและแก้ไขข้อผิดพลาดที่คุณจะพบขณะสร้างแอป รับบทแรกได้ฟรีที่นี่