ฉันจะจัดการกับความล้มเหลวของคนตัดไม้ได้อย่างไร


12

ในหลายแอปพลิเคชันของ บริษัท เราใช้ตัวบันทึกที่กำหนดเอง มันค่อนข้างแข็งแกร่งแม้ว่าเราอาจแทนที่ด้วยอะไรบางอย่างเช่น NLog ในอนาคต หนึ่งในหน้าที่ของคนตัดไม้คือการบันทึกข้อยกเว้นที่พบในแอปพลิเคชัน

สิ่งหนึ่งที่ฉันกังวลอยู่เสมอคือการจัดการข้อยกเว้นภายในตัวบันทึกช่วยให้เกิดความล้มเหลวเงียบ นั่นคือถ้าบันทึกไม่ได้ถูกเขียนสำหรับข้อยกเว้นที่กำหนด (เนื่องจากข้อผิดพลาดในตัวบันทึก) ฉันจะจัดการกับมันอย่างไรและ (อย่างใด) บันทึกข้อยกเว้นในตัวบันทึกเอง ?

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

ฉันได้ลองค้นหาทางออนไลน์และในเว็บไซต์ SE บางแห่ง แต่มันก็ยังไม่เกิดผลดีนักเนื่องจากการโพสต์ทั้งหมดมีข้อผิดพลาดในตัวบันทึก (แต่ไม่ใช่ข้อยกเว้นที่เป็นไปได้และวิธีการบันทึก) หรือข้อยกเว้นภายนอกตัวบันทึก



5
เข้าสู่ระบบเพื่อstderrที่สื่อออกของคุณล้มเหลวหรือว่า "เป็นไปไม่ได้" เกิดขึ้น
Doval

1
ส่งอีเมลไปที่นักพัฒนาหรือเพียงแค่แสดงข้อผิดพลาดด้วยที่อยู่อีเมลและให้ผู้ใช้คัดลอกและวางข้อผิดพลาด
Chloe

คำตอบ:


17

เมื่อคุณพบข้อยกเว้นภายในตัวบันทึกคุณไม่ควรใช้ตัวบันทึกเพื่อบันทึกข้อยกเว้นของตัวเอง เหตุผลที่เป็นเช่นนั้น:

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

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

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

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

วิธีหนึ่งคือการมีงาน cron ซึ่งจะตรวจสอบ "บันทึกพิเศษ" และส่งไปยังตำแหน่งที่เก็บข้อยกเว้นอื่น ๆ (ในที่สุดใช้ตัวบันทึกของคุณ แต่ระวังห่วงไม่ จำกัด หรือชั่วคราว!)


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

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

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

11

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

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

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

เป็นการดีที่คุณจะล้มเหลวอย่างเงียบ ๆ เพราะจะทำให้แอปพลิเคชันมีความซับซ้อนน้อยลง

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


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