การทำงานกับบันทึกใน Ruby
การบันทึกเป็นหนึ่งในงานหลักที่แอปพลิเคชันมักจะกล่าวถึง บันทึกจะใช้เมื่อคุณต้องการ เช่น
- ดูสิ่งที่เกิดขึ้นภายในแอปของคุณ
- ตรวจสอบพวกเขา หรือ
- รวบรวมเมตริกสำหรับข้อมูลบางอย่าง
เมื่อเรียนรู้ภาษาการเขียนโปรแกรมใหม่ ตัวเลือกแรกที่ชัดเจนในการบันทึกข้อมูลคือกลไกดั้งเดิม โดยปกติแล้วจะเป็นเรื่องง่าย มีการจัดทำเป็นเอกสาร และเผยแพร่ไปทั่วทั้งชุมชน
ข้อมูลบันทึกจะแตกต่างกันไปตามบริษัท ธุรกิจ และประเภทของแอปพลิเคชันที่คุณทำงานด้วย ดังนั้นจึงเป็นเรื่องสำคัญมากที่จะต้องเข้าใจว่าโซลูชันการบันทึกที่คุณและทีมของคุณเลือกจะส่งผลต่อการใช้งานโดยรวมอย่างไร
ในบทความนี้ เราจะพูดถึงตัวเลือกการบันทึกที่มีอยู่สำหรับ Ruby และ Rails ตั้งแต่ตัวเลือกในตัวไปจนถึงเฟรมเวิร์กของชุมชนบุคคลที่สามอันเป็นที่รัก ไปกันเถอะ!
ตัวเลือกในตัวของ Ruby
Ruby มาพร้อมกับตัวเลือกในตัว 2 ตัวเลือกในการจัดการการบันทึก ได้แก่ คำสั่งการพิมพ์ (ออกแบบมาเป็นพิเศษสำหรับสถานการณ์บรรทัดคำสั่ง) และคลาส Logger
มาสำรวจกันสักหน่อย
การพิมพ์ไปยังคอนโซล
Ruby มีสี่วิธีทั่วไปในการพิมพ์ข้อความไปยังคอนโซล:puts
, print
, p
และ pp
.
puts
method พิมพ์ทุกอย่างที่คุณส่ง ตามด้วยบรรทัดใหม่:
2.7.0 :001 > puts "Hey, I'm a log!"
Hey, I'm a log!
=> nil
print
วิธีการคล้ายกับ puts
อย่างไรก็ตาม มันจะแปลงอาร์กิวเมนต์เป็นสตริงเสมอโดยใช้ to_s
วิธีการ
สุดท้าย p
และ pp
เมธอดจะพิมพ์วัตถุดิบที่คุณส่งผ่านไปยังพวกเขาโดยไม่ทำการแปลง ข้อแตกต่างเพียงอย่างเดียวคือรูปแบบหลังจัดรูปแบบเอาต์พุตให้เยื้องมากขึ้น ในขณะที่รูปแบบเดิมไม่จัดรูปแบบ
บันทึกการใช้งาน
สำหรับแอปพลิเคชันที่ทำงานบนเซิร์ฟเวอร์ ไม่ควรพิมพ์ไปยังคอนโซล
เราใช้ Logger
. แทน ซึ่งยืดหยุ่นกว่ามาก
คุณสามารถใช้เพื่อพิมพ์บันทึก "debug" ด้วยวิธีต่อไปนี้:
require "logger"
logger = Logger.new(STDOUT)
logger.debug("I'm a debug log")
นอกจากนี้เรายังสามารถกำหนดค่าให้จัดเก็บบันทึกไปยังไฟล์ หรือส่งไปยังตัวรวบรวมบันทึก แทนที่จะพิมพ์ไปที่ STDOUT หากเราต้องการ
ในกรณีที่คุณสงสัยว่า "debug" เป็นระดับบันทึก ระดับการบันทึกช่วยให้คุณบอกระบบว่า "ข้อความบันทึกนี้เกี่ยวข้องกับเหตุการณ์บางประเภท" บันทึกในตัวมีหกระดับ:ร้ายแรง ข้อผิดพลาด เตือน ข้อมูล ดีบัก และไม่รู้จัก
logger.debug("I'm a debug log")
logger.info("I'm an info log")
logger.warn("I'm a warn log")
logger.error("I'm an error log: error message")
logger.fatal("I'm a fatal log")
เมื่อเราดูผลลัพธ์ของบันทึก เราจะเห็นว่าระดับบันทึก รหัสกระบวนการ และการประทับเวลาถูกผนวกเข้ากับแต่ละบรรทัด:
คุณสมบัติที่ยอดเยี่ยมอีกประการหนึ่งคือความสามารถในการตั้งค่า Logger
. ของคุณ วัตถุในระดับที่กำหนด:
logger.level = Logger::WARN
เมื่อคุณทำเช่นนี้ Logger
จะจัดการบันทึกเท่ากับหรือสูงกว่าเพื่อ เตือน ในความสำคัญ สิ่งนี้มีประโยชน์มากในการผลิต ซึ่งเราอาจไม่ต้องการบันทึกบันทึก "ดีบัก" เนื่องจากขนาดหรือเหตุผลด้านความปลอดภัย
นี่ควรเป็นผลลัพธ์:
การปรับแต่งบันทึกของคุณ
หากคุณต้องการปรับแต่งบันทึกของคุณ มีตัวเลือกมากมาย ตัวอย่างเช่น หากต้องการเปลี่ยนวันที่และเวลา ให้เขียนทับค่าเริ่มต้น:
logger.datetime_format = "%Y-%m-%d %H:%M"
นี่คือตัวอย่างผลลัพธ์:
W, [2020-07-28 10:50#87786] WARN -- : I'm a warn log
date_time
รูปแบบเป็นไปตามข้อกำหนดมาตรฐาน ดังนั้นโปรดอ้างอิงเมื่อทำการเปลี่ยนแปลงดังกล่าว
อย่างไรก็ตาม ในบางครั้ง คุณอาจต้องแก้ไขรูปแบบของบันทึกทั้งหมด เพื่อจุดประสงค์นี้ Ruby จัดเตรียมคลาส Formatter ทำงานโดยอนุญาตให้ devs เขียนทับเทมเพลตเริ่มต้นที่ Logger
ใช้สำหรับพิมพ์บันทึก
ลองนึกภาพว่าแอปของคุณใช้เครื่องมือวิเคราะห์บันทึกจากส่วนกลาง และต้องการให้พิมพ์บันทึกทั้งหมดของคุณใน name=value
รูปแบบ. นี่จะเป็นโค้ดตัวจัดรูปแบบใหม่:
logger.formatter = proc do |severity, datetime, progname, msg|
date_format = datetime.strftime("%Y-%m-%d %H:%M:%S")
"date=[#{date_format}] severity=#{severity.ljust(5)} pid=##{Process.pid} message='#{msg}'\n"
end
ที่นี่ เรากำลังใช้ประโยชน์จาก proc
เพื่อสกัดกั้นบันทึกทั้งหมดและเปลี่ยนวิธีการเริ่มต้นที่จะพิมพ์เป็นบันทึกที่ต้องการ ตอนนี้เราได้ผลลัพธ์ดังต่อไปนี้:
เครื่องมือสร้างดัชนีบันทึกแอปทั้งหมดของคุณด้วยโค้ดเพียงไม่กี่บรรทัด
กำลังเข้าสู่ระบบ JSON
ด้วยพลังของ Formatter
ในมือ ปรับแต่งบันทึกของคุณให้เป็นเอาต์พุตประเภทใดก็ได้ที่คุณต้องการ ตัวอย่างเช่น เราสามารถใช้โมดูล JSON เพื่อส่งออกบันทึกของเราในรูปแบบนั้น
require "json"
logger.formatter = proc do |severity, datetime, progname, msg|
date_format = datetime.strftime("%Y-%m-%d %H:%M:%S")
JSON.dump(date: "#{date_format}", severity:"#{severity.ljust(5)}", pid:"##{Process.pid}", message: msg) + "\n"
end
และนี่คือบันทึกผลลัพธ์:
การบันทึกไปยังไฟล์
อย่างที่เห็นก่อนหน้านี้ Logger
คอนสตรัคเตอร์ได้รับตำแหน่งที่ควรเก็บบันทึกเป็นอาร์กิวเมนต์แรก
หากคุณต้องการบันทึกบันทึกลงในไฟล์ ให้พูดดังนี้:
require 'logger'
logger = Logger.new('my_logs.log')
สิ่งนี้จะสร้างไฟล์ใหม่ my_logs.log ในโฟลเดอร์เดียวกับที่ไฟล์ Ruby ของคุณมีรหัสนี้อยู่:
อย่างไรก็ตาม คลาสยังอนุญาตให้มีตัวเลือกแบบกำหนดเองมากมาย เช่น การกำหนดค่านโยบายการเก็บรักษา ยกตัวอย่างต่อไปนี้:
# Keep data for the current week.
Logger.new('my_weekly_logs.log', 'weekly')
# Keep data for today and the past 2 months.
Logger.new('my_latest_2_months_logs.log', 2, 'monthly')
# Restarts the log over when it exceeds 26GB in size.
Logger.new('my_custom_logs.log', 0, 20 * 1024 * 1024 * 1024)
เป็นพารามิเตอร์ที่สอง Logger
ยอมรับคำจำกัดความว่าควรเก็บบันทึกหรือลบบันทึกบ่อยเพียงใด
ในวัตถุแรก บันทึกจะถูกเก็บไว้เป็นเวลาหนึ่งสัปดาห์เท่านั้น อันที่สองจะเก็บไว้เป็นเวลาสองเดือน ในขณะที่ล่าสุดจะวิเคราะห์เฉพาะขนาดของไฟล์ (เช่น เมื่อใดก็ตามที่ถึง 20GB ไฟล์นั้นจะถูกละทิ้ง) ตามพารามิเตอร์ที่สาม
การเข้าสู่ระบบ Ruby on Rails
ประโยชน์ส่วนใหญ่ของ Logger
ที่เราเคยเห็นมาจนถึงตอนนี้สามารถใช้ร่วมกับแอป Rails ได้ทั้งหมด Logger
. เวอร์ชัน Rails เป็นเพียงส่วนเสริมที่เรียบง่ายของคลาสดั้งเดิมของ Ruby
นอกจากนั้น Rails ยังเพิ่มคุณสมบัติที่ดีเพื่อให้ devs สามารถถ่ายทอดบันทึกของพวกเขาไปยังตัวตัดไม้หลายตัว ดังนั้น หากคุณต้องการทำงานกับไลบรารีการบันทึกมากกว่าหนึ่งไลบรารี คุณสามารถทำได้ภายใน Rails logger
:
custom_logger = Logger.new(STDOUT)
Rails.logger.extend(ActiveSupport::Logger.broadcast(custom_logger))
นอกจากนี้ยังมีประโยชน์เมื่อคุณต้องการข้อมูลอัจฉริยะเกี่ยวกับสถานที่ที่บันทึกของคุณควรไป บางส่วนของแอปของคุณอาจต้องการบันทึกในตำแหน่งที่แตกต่างกันหรือรูปแบบที่แตกต่างกัน
การเลือกเฟรมเวิร์กการบันทึกของบุคคลที่สาม
หากตัวบันทึกในตัวของ Ruby ไม่ได้ทำสิ่งที่คุณต้องการ คุณมีตัวเลือก
มีตัวเลือกมากมายในการเลือกเฟรมเวิร์กการบันทึกของบุคคลที่สาม ที่นิยมมากที่สุดคือ Lograge มาดูกันเลย!
ก้าวแรกกับ Lograge
Lograge สร้างขึ้นสำหรับแอป Rails หากคุณกำลังใช้ vanilla Ruby อาจไม่ใช่ตัวเลือกที่ดี
ในการติดตั้ง เพียงเพิ่มอัญมณีต่อไปนี้:
bundle add lograge
จากนั้น สร้างไฟล์กำหนดค่าใหม่ที่ config/initializers/lograge.rb ด้วยรหัสต่อไปนี้:
Rails.application.configure do
config.lograge.enabled = true
config.lograge.custom_options = lambda do |event|
{ time: event.time }
end
end
การกำหนดค่านี้เปิดใช้งาน Lograge และกำหนดเวลาที่จะต้องพิมพ์บันทึก ซึ่งถือเป็นเหตุการณ์ในกรอบงาน
เมื่อคุณเปิดแอป Rails และเข้าถึงปลายทางแรก Lograge จะพิมพ์สรุปคำขอ การเปรียบเทียบบันทึกก่อนและหลังการตั้งค่า Lograge ตามลำดับ ได้ผลลัพธ์ดังที่แสดงด้านล่าง:
อีกครั้ง Lograge ไม่ใช่กระสุนเงิน อันที่จริงมันเป็นกรอบความคิดที่มีความคิดเห็นมาก ดังนั้น คุณอาจต้องใช้มันร่วมกับ Logger
. ในตัว (หรือเฟรมเวิร์กอื่นๆ ตามที่คุณต้องการ)
สรุปผล
ในท้ายที่สุด จะเห็นได้ชัดว่าการบันทึกไม่ใช่เพียงส่วนสำคัญของโครงการของคุณเท่านั้น แต่ยังถูกประเมินต่ำเกินไปอีกด้วย เพื่อให้เข้าใจเครื่องมือที่คุณใช้มากขึ้น ไม่ว่าจะเป็นเครื่องมือดั้งเดิมหรือไม่ จะช่วยให้คุณได้ผลลัพธ์ที่ดีขึ้นเช่นกัน
อย่าลืมทำการทดสอบจำนวนมากเพื่อนำกรอบงานใหม่มาใช้ บางครั้งแพลตฟอร์มของคุณก็มาพร้อมกับตัวเลือกในตัวที่ยอดเยี่ยมอยู่แล้ว หากไม่เป็นเช่นนั้น ให้พิจารณาว่าอนุญาตให้ใช้เฟรมเวิร์กอื่นที่รวมเข้ากับเฟรมเวิร์กที่มีอยู่แล้วภายในหรือไม่
ขอให้โชคดี!