ฉันขอแนะนำให้คุณโทรไปที่ Elmah ในชั้นเรียนของคุณเอง
using Elmah;
public static class ErrorLog
{
/// <summary>
/// Log error to Elmah
/// </summary>
public static void LogError(Exception ex, string contextualMessage=null)
{
try
{
// log error to Elmah
if (contextualMessage != null)
{
// log exception with contextual information that's visible when
// clicking on the error in the Elmah log
var annotatedException = new Exception(contextualMessage, ex);
ErrorSignal.FromCurrentContext().Raise(annotatedException, HttpContext.Current);
}
else
{
ErrorSignal.FromCurrentContext().Raise(ex, HttpContext.Current);
}
// send errors to ErrorWS (my own legacy service)
// using (ErrorWSSoapClient client = new ErrorWSSoapClient())
// {
// client.LogErrors(...);
// }
}
catch (Exception)
{
// uh oh! just keep going
}
}
}
จากนั้นเพียงโทรหาเมื่อใดก็ตามที่คุณต้องการบันทึกข้อผิดพลาด
try {
...
}
catch (Exception ex)
{
// log this and continue
ErrorLog.LogError(ex, "Error sending email for order " + orderID);
}
สิ่งนี้มีประโยชน์ดังต่อไปนี้:
- คุณไม่จำเป็นต้องจำไวยากรณ์ที่เก่าแก่เล็กน้อยของการโทร Elmah
- หากคุณมี DLLs จำนวนมากคุณไม่จำเป็นต้องอ้างอิง Elmah Core จากทุก ๆ หนึ่ง - และเพียงแค่ใส่ค่านี้ใน 'System' DLL ของคุณเอง
- หากคุณต้องการจัดการเป็นพิเศษหรือเพียงต้องการเบรกพอยต์เพื่อแก้ไขข้อผิดพลาดคุณมีทั้งหมดในที่เดียว
- หากคุณย้ายออกจาก Elmah คุณสามารถเปลี่ยนที่เดียวได้
- หากคุณมีการบันทึกข้อผิดพลาดดั้งเดิมที่คุณต้องการเก็บไว้ (ฉันเพิ่งเกิดขึ้นกับกลไกการบันทึกข้อผิดพลาดแบบง่ายที่ผูกกับ UIs บางอย่างที่ฉันไม่มีเวลาลบทันที)
หมายเหตุ: ฉันได้เพิ่มคุณสมบัติ 'contextualMessage' สำหรับข้อมูลเชิงบริบท คุณสามารถละเว้นสิ่งนี้หากคุณต้องการ แต่ฉันคิดว่ามันมีประโยชน์มาก Elmah จะแยกข้อยกเว้นโดยอัตโนมัติดังนั้นข้อยกเว้นที่พื้นฐานจะยังคงถูกรายงานในบันทึก แต่บริบทจะมองเห็นข้อความเมื่อคุณคลิกที่มัน