2010-04-02 57 views
2

我正在尋找一個.NET庫/工具,記錄幾乎所有發生在我的C#應用​​程序(Windows窗體)中的事情。尋找一個自動化的日誌工具/庫的.NET

的問題是,我交付應用到客戶端(Windows XP中),並做一些任務後,看來微軟的經典錯誤窗口:

應用程序名稱遇到 問題需要關閉。我們 敬請原諒」

我目前正在處理我的應用程序異常,但是這是外在的東西,我不能從那個錯誤什麼的,所以我想任何汽車配合圖書館,幫助我。

它會工作,如果它記錄每一行代碼執行,或者只是記錄該錯誤出現之前執行的行,或者可以給我關於該錯誤的更多信息。這是一個多線程應用程序,並且需要定時器控件(一個用於每5秒觀看一個文件夾,另一個用於觀看線程列表...)。我在這裏使用Windows 7,一切似乎都正常。

+2

聽起來像你正在尋找一個魔法圖書館。 – ChaosPandion 2010-04-02 00:49:03

+0

也許是我,但有時我不認爲我會找到一個'魔術'庫,我終於做到了) – 2010-04-02 00:57:25

+0

你是什麼意思「外部的東西」?您是否檢查客戶機器上的事件查看器?也許它會表明CLR本身已經崩潰,就像着名的「致命執行引擎錯誤」一樣。在這種情況下,除非您只是記錄足夠的魔法步驟才能在您的開發系統上重現錯誤,否則您的記錄都不會有所幫助。 – 2010-04-02 01:05:35

回答

2

爲什麼不登錄Windows事件查看器,就是這麼做的。從簡單的配置設置中,您可以將其切換到包含所有級別,例如4-詳細,3-信息,2-警告,1-錯誤,您只需將這些消息記錄爲這四種類型之一即可。您也可以將它與布爾tracewitch結合起來用於調試跟蹤,但這不是必需的。

Windows事件查看器還爲您提供摘要,可以遠程連接,而且系統管理員可以輕鬆地使用它。

using System; 

using System.Diagnostics;

類MYSAMPLE {

public static void Main(){ 

    // Create the source, if it does not already exist. 
    if(!EventLog.SourceExists("MySource")){ 
     EventLog.CreateEventSource("MySource", "MyNewLog"); 
     Console.WriteLine("CreatingEventSource"); 
    } 

    // Create an EventLog instance and assign its source. 
    EventLog myLog = new EventLog(); 
    myLog.Source = "MySource"; 

    // Write an informational entry to the event log.  
    myLog.WriteEntry("Writing to event log."); 

} 

}

聽起來像是你需要做的是把一個斷點,單步執行代碼,如果它的線程,只是在Visual Studio中打開線程窗口,同時通過步進代碼。如果許多線程使其難以調試,則暫時在定時器上放置更長的延遲。

+0

基於問題的措辭,我不確定使用Windows事件查看器對於他要記錄的詳細程度而言是理想的。 Windows事件日誌的大小是有限制的,並且取決於它如何配置,達到這些限制可能會導致一些主要問題。此外,由於這是在客戶端計算機上運行,​​因此導出和獲取活動批次的副本不太理想。但是,使用log4net,將它保存到事件日誌是一個選項,只是我不推薦。 – Jaxidian 2010-04-02 01:05:11

+0

當然,開發過程中甚至需要進行大量的日誌記錄工作,甚至需要在產品調試階段完成,但這只是暫時的,而且您經常會清除事件日誌以重新開始,管理員知道如何配置它並且無需爲此調用它。在生產中,它不應該被設置爲冗長的,我沒有看到在日誌中顯示每個方法名稱的重點......在生產中,事實上託管的代碼應該被混淆並且方法名稱被隱藏。 你也可以在.Net4.0中考慮這個ETW,也用於記錄和新建。 http://msdn.microsoft.com/en-us/library/dd264810(v=VS.100).aspx – GenEric35 2010-04-02 01:17:01

4

我不認爲你會找到一個只需插入的日誌工具,它會記錄發生的每一件事情。你將不得不插入任何有日誌框架的鉤子。 Here是一個流行的,免費的。

+0

@Jaxidian:謝謝你的回覆。我會測試log4net,並會讓你知道;) – 2010-04-02 00:51:50

-2

我在過去使用log4net。您可以將其連接起來,以便在發生未捕獲的異常時將其記錄到文件或寫入數據庫。

+0

我發現[這篇文章](http://www.codeproject.com/Articles/140911/log-net-Tutorial) ,演示何在代碼項目中使用它 和這裏是一個[完整的視頻](https://youtu.be/2lAdQ_QwNww)在YouTube上也 – 2016-07-01 08:58:32

1

關於您的需求(「記錄幾乎所有發生在我的C#應用​​程序中的事情」)最接近的是使用帶AOP支持和自動異常處理的日誌記錄框架。面向方面的編程將允許您測試您的方法並跟蹤方法執行。結合使用諸如SmartInspect(免責聲明:我是SmartInspect背後的開發人員之一)等日誌工具,您可以監視和分析方法執行並查看上下文中的異常(請參見下面的截圖)。

要記錄您的應用程序數據和事件,您將不得不手動測試您的代碼,真的沒有辦法繞過它。如果你有一個大的應用程序,一次手動設置你所有的代碼將不起作用(這太耗時),所以我通常建議首先從最關鍵的例程和模塊開始。

alt text http://www.gurock.com/images/feature/smartinspect-screenshot.png

0

您是否嘗試過ETW? ETW是Windows中速度最快,開銷最小的測井系統。 ETW內置於內核中。 MS爲他們構建的每個應用程序(從Windows到VS.NET)使用ETW。

這不是一個自動化的記錄工具。但是,無需修改代碼即可在應用程序中爲您提供每次調用的堆棧跟蹤。如果您需要添加自定義日誌消息,那麼您將爲此編寫代碼。

下面是一些鏈接爲ETW,我也有ETW in managed code

2

的想法幾篇文章從 C#: Try-catch every line of code without individual try-catch blocks

我創建了一個類是這樣的:

public delegate void VoidDelegate(); 
public static class L 
{ 
    public static void g(VoidDelegate v) 
    { 
     DateTime now1, now2; 
     StackTrace trace = new StackTrace(true); 

     now1 = DateTime.Now; 
     v(); 
     now2 = DateTime.Now; 

     File.AppendAllText(@"C:\L.g", 
      now1.ToString("yyyy/MM/dd HH:mm:ss.fffffff") + "\t" + 
      trace.GetFrame(1).GetFileName() + ":" + trace.GetFrame(1).GetFileLineNumber() + "\t" + 
      (now2 - now1).Seconds.ToString() + ((now2 - now1).Milliseconds/1000f).ToString().Substring(1) + 
      Environment.NewLine); 
    } 
} 

申請日誌,您可以添加

L.g(() =>/**/ 

/**/); 

到每一個可能的線,例如

string[] sAryArg = null; 
L.g(() =>/**/sAryArg = Environment.GetCommandLineArgs()/**/); 
L.g(() =>/**/this.lblUserName.Text = sAryArg[3]/**/); 
L.g(() =>/**/this.lblDatabase.Text = DbUtil._sEnvID_/**/); 
L.g(() =>/**/this.lblVersion.Text = 
    Assembly.GetExecutingAssembly().GetName().Version.Major.ToString() + "." + 
    Assembly.GetExecutingAssembly().GetName().Version.Minor.ToString() + "." + 
    Assembly.GetExecutingAssembly().GetName().Version.Build.ToString()/**/); 

生成的日誌文件將看起來像這樣:

2012/02/29 10:41:18.1835418 d:\ XXX \ frmMain.cs:351 0.015

2012/02/29 10:41:18.1991666 D:\ xxx \ frmMain.cs:352 1.203

要禁用日誌,只需批量刪除兩個周圍的標記。