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

การเข้าสู่ระบบ Ruby ด้วย Logger และ Lograge

การทำงานกับบันทึกใน 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")

เมื่อเราดูผลลัพธ์ของบันทึก เราจะเห็นว่าระดับบันทึก รหัสกระบวนการ และการประทับเวลาถูกผนวกเข้ากับแต่ละบรรทัด:

การเข้าสู่ระบบ Ruby ด้วย Logger และ Lograge

คุณสมบัติที่ยอดเยี่ยมอีกประการหนึ่งคือความสามารถในการตั้งค่า Logger . ของคุณ วัตถุในระดับที่กำหนด:

logger.level = Logger::WARN

เมื่อคุณทำเช่นนี้ Logger จะจัดการบันทึกเท่ากับหรือสูงกว่าเพื่อ เตือน ในความสำคัญ สิ่งนี้มีประโยชน์มากในการผลิต ซึ่งเราอาจไม่ต้องการบันทึกบันทึก "ดีบัก" เนื่องจากขนาดหรือเหตุผลด้านความปลอดภัย

นี่ควรเป็นผลลัพธ์:

การเข้าสู่ระบบ Ruby ด้วย Logger และ Lograge

การปรับแต่งบันทึกของคุณ

หากคุณต้องการปรับแต่งบันทึกของคุณ มีตัวเลือกมากมาย ตัวอย่างเช่น หากต้องการเปลี่ยนวันที่และเวลา ให้เขียนทับค่าเริ่มต้น:

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 เพื่อสกัดกั้นบันทึกทั้งหมดและเปลี่ยนวิธีการเริ่มต้นที่จะพิมพ์เป็นบันทึกที่ต้องการ ตอนนี้เราได้ผลลัพธ์ดังต่อไปนี้:

การเข้าสู่ระบบ Ruby ด้วย Logger และ Lograge

เครื่องมือสร้างดัชนีบันทึกแอปทั้งหมดของคุณด้วยโค้ดเพียงไม่กี่บรรทัด

กำลังเข้าสู่ระบบ 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

และนี่คือบันทึกผลลัพธ์:

การเข้าสู่ระบบ Ruby ด้วย Logger และ Lograge

การบันทึกไปยังไฟล์

อย่างที่เห็นก่อนหน้านี้ Logger คอนสตรัคเตอร์ได้รับตำแหน่งที่ควรเก็บบันทึกเป็นอาร์กิวเมนต์แรก

หากคุณต้องการบันทึกบันทึกลงในไฟล์ ให้พูดดังนี้:

require 'logger'
logger = Logger.new('my_logs.log')

สิ่งนี้จะสร้างไฟล์ใหม่ my_logs.log ในโฟลเดอร์เดียวกับที่ไฟล์ Ruby ของคุณมีรหัสนี้อยู่:

การเข้าสู่ระบบ Ruby ด้วย Logger และ Lograge

อย่างไรก็ตาม คลาสยังอนุญาตให้มีตัวเลือกแบบกำหนดเองมากมาย เช่น การกำหนดค่านโยบายการเก็บรักษา ยกตัวอย่างต่อไปนี้:

# 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 ตามลำดับ ได้ผลลัพธ์ดังที่แสดงด้านล่าง:

การเข้าสู่ระบบ Ruby ด้วย Logger และ Lograge

อีกครั้ง Lograge ไม่ใช่กระสุนเงิน อันที่จริงมันเป็นกรอบความคิดที่มีความคิดเห็นมาก ดังนั้น คุณอาจต้องใช้มันร่วมกับ Logger . ในตัว (หรือเฟรมเวิร์กอื่นๆ ตามที่คุณต้องการ)

สรุปผล

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

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

ขอให้โชคดี!