วิธีที่ดีที่สุดในการจัดการการบันทึกข้อผิดพลาดสำหรับข้อยกเว้นคืออะไร


13

บทนำ

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

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

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

ที่ปลายอีกด้านของสเปกตรัมอาจเป็นฐานข้อมูลปกติที่ช่วยให้คุณกดปุ่มและดูกราฟข้อผิดพลาดต่อวันหรือระบุว่าข้อผิดพลาดประเภทใดที่พบบ่อยที่สุดในระบบ X คือเซิร์ฟเวอร์ A มีฐานข้อมูลมากกว่าหรือไม่ ข้อผิดพลาดการเชื่อมต่อกว่าเซิร์ฟเวอร์ B และอื่น ๆ

สิ่งที่ฉันอ้างถึงที่นี่คือการบันทึกข้อผิดพลาด / ข้อยกเว้นระดับรหัสโดยระบบรีโมต - ไม่ใช่การติดตามปัญหา "ตามมนุษย์" เช่นเสร็จสิ้นกับ Jira, Trac เป็นต้น


คำถาม

ฉันกำลังมองหาแนวคิดจากนักพัฒนาที่ใช้ระบบประเภทนี้โดยเฉพาะเกี่ยวกับ:

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

ตัวอย่างเช่นฉันว่าฟังก์ชัน "แสดงรายการที่ซ้ำกัน" ซึ่งระบุข้อผิดพลาดหลายครั้ง (โดยไม่ต้องกังวลเกี่ยวกับรายละเอียด 'ไม่สำคัญ' ที่อาจแตกต่างกัน) เป็นสิ่งสำคัญ
ปุ่มสำหรับ "สร้างปัญหาใน [Jira / etc] สำหรับข้อผิดพลาดนี้" ฟังดูเหมือนเป็นการประหยัดเวลาได้ดี

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


2
สิ่งหนึ่งที่ควรจดจำ: หากคุณกำลังบันทึกบางสิ่งบางอย่างผิดปกติและอาจมีสิ่งผิดปกติมากกว่าหนึ่งอย่าง ดำเนินการบันทึกต่อไปบนด้านที่เรียบง่าย
David Thornley

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

ฉันได้เห็นข้อยกเว้น loggers ซึ่งโยนข้อยกเว้นตัวเองใน String.Format (C #) :) เก็บ loggin ง่าย ๆ โดยไม่มีความเสี่ยงไม่ใช่ไดนามิก (เช่นอย่าแยกไฟล์ XML ขณะที่คุณพยายามบันทึกข้อยกเว้น) หลีกเลี่ยงพลวัตในการบันทึกข้อผิดพลาดถ้าคุณทำได้ หากคุณมีสิ่งต่าง ๆ ที่กำหนดค่าในไฟล์ xml ฉันคิดว่าเป็นการดีกว่าที่จะสร้างรหัสจริงตาม (ทึบ) แทนที่จะแยกวิเคราะห์ไฟล์ปรับแต่งนั้นในขณะใช้งานในขณะที่คุณกำลังรายงานข้อผิดพลาด (ไดนามิก) ) นั่นคือประสบการณ์ของฉันต่อไป คุณอาจต้องการแผน B สำหรับการบันทึก - หากการส่งออกแฟนซีล้มเหลวให้ล็อกง่าย
งาน

คำตอบ:


5

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

ผมขอแนะนำให้คุณตรวจสอบห้องสมุดขององค์กรของ MicrosoftและLog4Net

คุณสมบัติบางอย่างของLog4Net

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

1
คนตัดไม้ที่ดีจะช่วยให้คุณสามารถผลักดันข้อผิดพลาดของคุณไปยังการเลือกของคุณ (อีเมล, DB, ไฟล์, ฯลฯ )
เคนเฮนเดอร์สัน

1

ในกรณีของแอปพลิเคชันฐานข้อมูล ID บางประเภท (เช่น<TABLE>:<PrimaryKeyID>) ที่ช่วยให้คุณติดตามระเบียนในฐานข้อมูลที่เกี่ยวข้องกับขอบเขตที่มีการตรวจจับข้อยกเว้น

ฉันได้ทำกับ Oracle และ PL / SQL บันทึก ID ในตารางฐานข้อมูลภายใน aplication จากตัวจัดการข้อยกเว้น


ดีอย่างแน่นอนในการบันทึกอย่างน้อยตารางและบันทึกที่กำลังดำเนินการ ยังดีกว่าแน่นอนว่ามีคำสั่ง SQL ที่พยายาม (และพารามิเตอร์ใด ๆ )
Peter Boughton

1

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

ในกรณีของฉันฉันสร้างแอพขนาดเล็กและสคริปต์ sql ที่ทำให้บางสิ่งง่ายขึ้น นี่คือสิ่งที่ฉันชอบ:

  • การรวมกลุ่มข้อผิดพลาดเดียวกันเข้าด้วยกัน (เช่นผู้ใช้ 100 คนทุกคนพบข้อผิดพลาดเดียวกันในเวลาเดียวกันคือ 1 รายงานข้อบกพร่องพร้อมบันทึกจำนวนเหตุการณ์ที่เกิดขึ้น)
  • ยื่นตั๋วอัตโนมัติในตัวติดตามเคส (ไม่เคยจัดการเพื่อให้ 'คลิกเพียงปุ่มเดียว' แต่ต้องการทำเสมอ)
  • ชื่อผู้ใช้ของผู้ใช้ซอฟแวร์ (ไม่เพียง แต่เครื่องซึ่งสามารถใช้ได้กับคนตัดไม้ส่วนใหญ่) ในบางกรณีบัญชีผู้ใช้อัตโนมัติทำให้เกิดปัญหาในขณะที่คนอื่น ๆ ผู้ใช้ที่เฉพาะเจาะจงเป็นสาเหตุของปัญหา "ฉันต้องดูไมค์ทำงานบางอย่างเขายังคงก่อให้เกิดข้อผิดพลาดเฉพาะ"
  • "การดำเนินการของผู้ใช้" - ฉันมีสแต็คทั่วโลกที่จะติดตามการกดคลิก / ปุ่มที่สามารถดำเนินการได้ทุกครั้งที่ผู้ใช้ทำและมีการจัดการกับบันทึกข้อผิดพลาด การทำซ้ำข้อผิดพลาดมักเป็นกรณีของการเดินผ่านการติดตามนั้นและดำเนินการตามขั้นตอนเดียวกับผู้ใช้ (ฉันหวังว่าจะสร้างเครื่องทดสอบ CodedUI ที่จะแยกการติดตามและดำเนินการตามขั้นตอนโดยอัตโนมัติ แต่ไม่เคยทำ)

0

บางครั้งข้อมูลบันทึกมีขนาดใหญ่เกินกว่าจะเก็บไว้ในดิสก์ได้ วิธีหนึ่งที่ฉันได้เห็นคือการเขียนรายการบันทึกของคุณไปยัง firehose (ใน, พูด, perl) บางอย่างเช่นนี้:

# Create socket.
my $sock = IO::Socket::INET->new(
    Proto       => 'udp',
    PeerAddr    => $bcastaddr,
    Broadcast   => 1,
) or die "Can't create socket ($bcastaddr): $!";

while (<>) {
    chomp;
    unless (/File\ does\ not\ exist:/) {
        $sock->send("$eventtype:$_") or warn "Can't send: $!";
    }
}

จากนั้นนักวิเคราะห์สามารถดูว่าเขา / เธอต้องการดูอะไร


3
ไม่แน่ใจว่า 'firehose' คืออะไร? เมื่อพิจารณาความจุของดิสก์วันนี้ฉันหวังว่าข้อผิดพลาดจะไม่เป็นเช่นนั้นขนาดบันทึกจะเป็นปัญหา
Peter Boughton

0

นี่คือบางสิ่งที่ฉันได้เรียนรู้จากการตรวจสอบข้อผิดพลาดในแอปพลิเคชันของเรา:

  • ความสามารถในการปรับแต่งล็อกไฟล์กลิ้ง (โดยทั่วไปฉันใช้ log4net / log4j สำหรับการเข้าสู่ระบบในแอปพลิเคชันและBareTailเพื่อติดตามล็อก) มีประโยชน์มากสำหรับการตรวจสอบสถานะปัจจุบันของระบบ
  • เพื่อดูว่าเมื่อไรที่ปัญหาถูกนำมาใช้และอัตราที่ปัญหาเกิดขึ้นมันเป็นเรื่องดีที่มีปัญหาในฐานข้อมูลที่มีการประทับเวลาเพื่อให้คุณสามารถเรียกใช้รายงาน
  • ความสามารถในการส่งอีเมล / SMS / การแจ้งเตือนด้วยเสียงนั้นมีประโยชน์อย่างยิ่งในการทำให้แน่ใจว่าระบบยังคงทำงานอยู่ แต่คุณต้องมีความสามารถในการปรับแต่งประเภทของข้อผิดพลาดที่เตือนคุณได้อย่างง่ายดาย หากคุณได้รับอีเมลแจ้งข้อผิดพลาด 800 ครั้งต่อวันคุณจะพลาด "โอ้ไม่มีดาต้าเซ็นเตอร์กำลังร้อนแรง"

ฉันได้ผลลัพธ์ที่ยอดเยี่ยมสำหรับ log4net เพราะมันทำให้การเข้าสู่หลาย ๆ ที่เป็นเรื่องง่ายและเปลี่ยนแปลงการกำหนดค่าการบันทึกได้ง่ายเช่นกัน


0

elmah เป็นระบบบันทึกข้อผิดพลาดโอเพนซอร์สสำหรับแอป ASP.NET และสามารถเพิ่มลงในระบบที่มีอยู่ (ใช้ NuGet http://nuget.codeplex.com/ ) ได้อย่างรวดเร็วและง่ายดาย รองรับฟังก์ชั่นแบ็คเอนด์และการแจ้งเตือนต่างๆ

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

http://code.google.com/p/elmah/

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

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

  • การบันทึกข้อยกเว้นที่ไม่สามารถจัดการได้เกือบทั้งหมด
  • หน้าเว็บเพื่อดูบันทึกข้อยกเว้นทั้งหมดจากระยะไกล
  • เว็บเพจเพื่อดูรายละเอียดทั้งหมดของข้อยกเว้นที่บันทึกไว้จากระยะไกลรวมถึงร่องรอยสแต็คสี
  • ในหลายกรณีคุณสามารถตรวจสอบหน้าจอสีเหลืองเดิมของความตายที่ ASP.NET สร้างขึ้นสำหรับข้อยกเว้นที่กำหนดแม้จะcustomErrorsปิดโหมดก็ตาม
  • การแจ้งเตือนทางอีเมลของข้อผิดพลาดแต่ละรายการในเวลาที่เกิดขึ้น
  • ฟีด RSS ของ 15 ข้อผิดพลาดล่าสุดจากบันทึก ...

ELMAH ไม่น่าเชื่อถือ ถ้า httpcontext เป็น NULL ==> boom
Quandary

@ ความสงสัยฉันสงสัยว่าฉันขาดอะไรไปหรือเปล่า? เราเห็นข้อผิดพลาดเมื่อพยายามเข้าสู่ ELMAH จากแอปและ HttpContext เป็นโมฆะ แต่ถ้าคุณมีระดับรูทจับ -> สร้างตัวบันทึก elmah ใหม่พร้อมบริบท null และบันทึกมันทำงานได้ดี มีสถานที่ในเว็บไซต์ ASP.NET ปกติที่อาจลองและบันทึกและ HttpContext เป็นโมฆะหรือไม่
Ian Grainger
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.