ทำไมต้องใช้การบันทึกแทนการพิมพ์


92

สำหรับการดีบักอย่างง่ายในโครงการที่ซับซ้อนมีเหตุผลที่ต้องใช้ python logger แทนการพิมพ์หรือไม่? แล้วกรณีการใช้งานอื่น ๆ ล่ะ? มีกรณีการใช้งานที่ดีที่สุดที่เป็นที่ยอมรับสำหรับแต่ละกรณี (โดยเฉพาะเมื่อคุณกำลังมองหา stdout เท่านั้น)

ฉันได้ยินมาตลอดว่านี่เป็น "แนวทางปฏิบัติที่ดีที่สุด" แต่ฉันไม่สามารถหาสาเหตุได้


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


3
ผมไม่คิดว่ามีเคยprintเป็นกรณีการใช้งานที่ดีที่สุดสำหรับ
SingleNegationElimination

4
เอกสารหลามเข้าสู่ระบบ กล่าวว่ากรณีที่ดีที่สุดสำหรับการใช้งานprintคือการแสดงข้อความช่วยเหลือสำหรับผู้ใช้ในการประยุกต์ใช้บรรทัดคำสั่ง
เฉอะแฉะ

เมื่ออ่านคำตอบทั้งหมดนี้ฉันต้องการถามคำถามย้อนกลับ: มีเหตุผลที่จะไม่ใช้การบันทึกหรือไม่?
information_interchange

คำตอบ:


101

แพ็คเกจการบันทึกมีคุณสมบัติที่มีประโยชน์มากมาย:

  • ง่ายต่อการดูว่าที่ไหนและเมื่อใด (แม้จะเป็นหมายเลขสายอะไรก็ตาม) การโทรบันทึกจะถูกสร้างขึ้นจาก
  • คุณสามารถเข้าสู่ระบบไฟล์ซ็อกเก็ตอะไรก็ได้ทั้งหมดในเวลาเดียวกัน
  • คุณสามารถแยกความแตกต่างของการบันทึกของคุณตามความรุนแรง

พิมพ์ไม่มีสิ่งเหล่านี้

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


2
พูดได้เป็นอย่างดี. บางครั้งฉันจะใช้การพิมพ์เมื่อทำการดีบักสคริปต์ทิ้งที่ฉันตั้งใจจะเรียกใช้เพียงครั้งเดียว แต่รหัสใด ๆ ที่ดวงตาของมนุษย์คนอื่นจะมองเห็นได้หรือที่ตั้งใจจะใช้งานคนตัดไม้นานกว่าหนึ่งวัน
TimothyAWiseman

22

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

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


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

11

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

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

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

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

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

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


4

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


1

การบันทึกโดยพื้นฐานแล้วจะสร้างฐานข้อมูลข้อความธรรมดาที่สามารถค้นหาได้ของผลลัพธ์การพิมพ์พร้อมกับข้อมูลเมตาอื่น ๆ (การประทับเวลา, loglevel, หมายเลขบรรทัด, กระบวนการ ฯลฯ )

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

tail -f mylogfile.log | egrep "key_word1|key_word2"

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

ฉันมักจะใช้คำสั่งพิมพ์เพราะมันขี้เกียจและง่ายการเพิ่มการบันทึกจำเป็นต้องมีรหัสแผ่นหม้อไอน้ำเฮ้เรามี yasnippets (emacs) และ ultisnips (vim) และเครื่องมือสร้างเทมเพลตอื่น ๆ ดังนั้นทำไมต้องยกเลิกการบันทึกสำหรับข้อความพิมพ์ธรรมดา!?

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.