2009-10-23 21 views
0

我正在使用提供API的第三方應用程序來使用它們的事件記錄系統。我想在代碼中的方法級別捕獲異常,並將該異常傳遞給第三方的事件日誌記錄系統。但我不知道如何從標準的Exception對象中提取eventid,category和EventType,所以我可以將它傳遞給Write(字符串消息,字符串類別,int eventID,EventType eventType)。ASP.NET/C#:如何從Exception對象中提取信息?

public EventLogs 
{ 
    private EventLogs() 
    { 
    }  
    public static void Write(EventLogEntry entry) 
    { 
     try 
     { 
      if (Globals.IsNullorEmpty(entry.MachineName)) 
      { 
       entry.MachineName = Environment.MachineName; 
      } 
      if (!Globals.IsNullorEmpty(entry.Message)) 
      { 
       entry.Message = Globals.HtmlEncode(entry.Message); 
      } 
      CommonDataProvider.Instance().WriteEventLogEntry(entry); 
     } 
     catch 
     { 
     } 
    } 

    public static void Write(string message, string category, int eventID, EventType eventType) 
    { 
     Write(message, category, eventID, eventType, -1); 
    } 

    public static void Write(string message, string category, int eventID, EventType eventType, int settingsID) 
    { 
     Write(new EventLogEntry { Message = message, Category = category, EventID = eventID, EventType = eventType, SettingsID = settingsID }); 
    } 
} 

回答

0

您的例外情況不包含該信息。

生成的異常和記錄到Windows窗口上的事件日誌是兩個不同的概念。

事件日誌採用您正在描述的參數,並在生成日誌條目時使用它,然後您可以在計算機的事件查看器中查看該日誌條目。

以下是寫入事件日誌的msdn article,它有更多關於這些參數的用途的信息。

1

Write()調用的參數與.NET異常對象沒有任何特定關係。但是,這些參數與存儲在正常窗口事件日誌中的項目密切對應。根據您使用的日誌記錄系統,這些數據可能會或可能不會在Windows事件日誌中結束。他們的設計很可能是模仿Windows事件日誌。

您爲參數指定的內容取決於您的需求和目標。有些人喜歡在消息中存儲Exception.ToString()的結果,類別中的應用程序或應用程序域的名稱以及用戶定義的eventID標識碼。

您可能希望存儲在消息中的其他可能有用的信息位是異常的類型名稱,堆棧跟蹤以及與異常關聯的二進制數據。

最後,存儲0作爲錯誤的eventID是非典型的。這可能會使用他們自己的日誌掃描工具甩掉其他IT人員。

System.Exception @ MSDN
System.Exception Properties @ MSDN

0

你需要明確捕獲異常到一個變量,然後就可以查詢它,把它拆開,在其他地方寫的作品。

catch(Exception exc) 
{ 
    Console.Write(exc.Message); 
} 

的System.Exception是所有異常的基類,所以它可以代表被拋出的任何異常。查看來自MSDN的所有members of the Exception class

編輯: 標準的.NET異常對象不具有事件ID,類別和事件類型,所以你必須決定什麼,這些將是書面形式向第三方日誌工具之前。

例如,您可以選擇分類基於異常的類型例外,因爲你可以趕上像這樣時可以區分它們,

catch(FileNotFoundException fnfExc) 
{ 
    Logger.Log(fnfExce.Message, CategoryEnum.DiskError); 
} 
catch(FilePermissionError permExc) 
{ 
    Logger.Log(permExc.Message, CategoryEnum.DiskError); 
} 
catch(Exception exc) { //catches anything else not caught above 
    Logger.Log(exc.Message, CategoryEnum.Uknown); 
}