2012-02-20 101 views
2

我想問一些具有特定功能的日誌記錄機制或框架。我已經在我的應用程序(DLL庫)與動態日誌框架或技術

Log.WriteLine("{0}.{1}()", System.Reflection.MethodInfo.GetCurrentMethod().DeclaringType, System.Reflection.MethodInfo.GetCurrentMethod().Name); 

在日誌是靜態類,其功能洛編寫使用StreamWriter的

public void LogWriteLine(string text, params object[] args) { 
    lock (this) { 
     StreamWriter log = new StreamWriter(logFile, true); 
     if (log != null) { 
     log.WriteLine("{0:yyyy-MM-dd HH:mm:ss} {1}", DateTime.Now, String.Format(text, args)); 
     log.Flush(); 
     log.Close(); 
     } 
    } 
} 

我的問題是文件,我沒有Log.WriteLine只需在應用程序的特定部分調用我的應用程序,因爲它會創建非常大的文件。但現在,我構建了我的應用程序,並將其發佈給開發人員,他們爲此付出了一些時間。之後,他們發給我錯誤,但在我的版本中,錯誤已不再存在(應用程序的開發繼續進行,因此可以修復)。

因此,我想在應用程序中設置一些設置文件,告訴應用程序我需要更多的日誌,並且能夠運行應用程序的測試版本,而無需使用記錄器的不同設置重新構建它。

簡而言之:我怎樣才能告訴應用程序窗體一些設置文件,只記錄特定的東西,例如只有一個類或一種方法?

回答

1

我需要做類似的事情。這是我做到的。

我創建了一個類別類,並在日誌記錄對象初始化時用作參數。你可以看到「Log.GetInstance()。AddCategory(this)」這個行,我的日誌對象是一個單例。

單例,有一些方法來添加和去除類別

/// <summary> 
/// Add a new category to the list of available categories 
/// </summary> 
/// <param name="newCat">The category object to add</param> 
public void AddCategory(Category newCat) 
{ 
    // Ensure that the category doesn't already exist in the list 
    if(this.m_CategoryList.Contains(newCat) == false) 
    { 
     // Add the new category to the list 
     this.m_CategoryList.Add(newCat); 
    } 
} 

/// <summary> 
/// Remove a category to the list of available categories 
/// </summary> 
/// <param name="catName">The name of the category to be removed</param> 
public void RemoveCategory(string catName) 
{ 
    Category toRemove = null; 

    // Iterate through the categories looking for a match 
    foreach(Category cat in this.m_CategoryList) 
    { 
     // Compare the category names (case insensitive) 
     if(cat.Name.ToUpper() == catName.ToUpper()) 
     { 
      // Assign the category to remove to a local variable and exit the loop 
      toRemove = cat; 
      break; 
     } 
    } 

    // Remove the category if it's been located 
    if(toRemove != null) 
    { 
     this.m_CategoryList.Remove(toRemove); 
    } 
} 

當處理日誌事件,現在檢查類別的活動狀態,以查看是否需要該消息的僅有的情況。

/// <summary> 
/// Create a log entry in the log file and then Fire an event for the log message to be handled 
/// </summary> 
/// <param name="category">The category to log the message against</param> 
/// <param name="args"> Message logging arguments used by the event</param> 
public void WriteLine(Category category, MessageEventArgs args) 
{ 
    // Ensure that the category specified exists in the array list 
    if(this.m_CategoryList.Contains(category)) 
    { 
     // Ensure the category is active 
     if(category.Active == true) 
     { 
      if(!category.ExcludeFromLogFile) 
      { 
       // Try and log the message to the log file 
       this.WriteLineToFile(category, args); 
      } 

      // Ensure an event handler has been assigned 
      if(MessageEvent != null) 
      { 
       // This message event is handled by the UI thread for updating screen components. 
       MessageEvent(category, args); 
      } 
     } 
    } 
} 

最後,如果您希望消息顯示在屏幕上,您需要在UI線程中處理消息事件。這裏是我的一個列表視圖組件的示例...

private void ListViewLogging_MessageEvent(Category category, MessageEventArgs args) 
{ 
    // Ensure the event was received in the UI thread 
    if(this.InvokeRequired) 
    { 
     if(args.Message != null) 
     { 
      // We aren't in the UI thread so reFire the event using the main thread 
      this.BeginInvoke(new MessageReceivedDelegate(this.ListViewLogging_MessageEvent), new object[]{category,args}); 
     } 
    } 
    else 
    { 
     // We are currently in the main thread. 
     // Lock so no other thread can be handled until event processing has been finished 
     lock(this) 
     { 
      // Create a new ListView item for the new message 
      ListViewItem newEntry = null;; 

      // Determine the category type 
      switch(category.Name) 
      { 
       case "Serious": 
       { 
        // Serious error detected 
        if(args.Message.Length > 0) 
        { 
         newEntry = new ListViewItem(new string[]{category.Name, args.Occurred.ToLongTimeString(), args.Message}); 
         newEntry.BackColor = Color.Red; 
        } 
        break; 
       } 
       case "Warning": 
       { 
        // Warning detected. 
        if(args.Message.Length > 0) 
        { 
         newEntry = new ListViewItem(new string[]{category.Name, args.Occurred.ToLongTimeString(), args.Message}); 
         newEntry.BackColor = Color.Orange; 
        } 
        break; 
       } 
       case "Progress": 
       { 
        // If a message has been specified, log it 
        if(args.Message.Length > 0) 
        { 
         newEntry = new ListViewItem(new string[]{"", args.Occurred.ToLongTimeString(), args.Message}); 
        } 
        break; 
       } 
       case "Debug": 
       { 
        // Just a standard Debug event so just display the text on the screen 
        if(args.Message.Length > 0) 
        { 
         newEntry = new ListViewItem(new string[]{category.Name, args.Occurred.ToLongTimeString(), args.Message}); 
         newEntry.BackColor = Color.LightGreen; 
        } 
        break; 
       } 
       case "Info": 
       default: 
       { 
        // Just a standard event so just display the text on the screen 
        if(args.Message.Length > 0) 
        { 
         newEntry = new ListViewItem(new string[]{category.Name, args.Occurred.ToLongTimeString(), args.Message}); 
        } 
        break; 
       } 
      } 
      // Add the item if it's been populated 
      if(newEntry != null) 
      { 
       this.Items.Add(newEntry); 
       this.EnsureVisible(this.Items.Count-1); 
      } 
     } 
    } 
} 
+0

好吧,知道如何激活或停用特定事件的日誌記錄而不更改和重建代碼? – Zavael 2012-02-20 10:20:06

+0

您需要訪問器方法來記錄對象中的類別容器。找到類別並設置活動狀態。另一種方法是在默認情況下使用一些靜態類別(我使用嚴重,警告,信息和調試),然後對這些特定類別使用訪問方法。 – TeamWild 2012-02-20 10:54:46

+0

首先我想了解一些機制,在設置文件中,我可以動態地添加類名或方法名,然後運行coul讀取設置文件(在開始時)並決定要記錄什麼的應用程序......但這種「分層「的日誌調試,警告等也可以是有益的,謝謝:) – Zavael 2012-02-20 12:16:06

1

您可以使用log4net的記錄的和過濾的。見introduction article

+0

+1感謝答案,我會看它太 – Zavael 2012-02-20 12:17:28

2

我會看看Log4Net。 Log4Net提供日誌級別的App.Config配置,重定向到多個輸出,允許同步或異步(緩衝)日誌記錄。

一個很好的文章在這裏:http://www.codeproject.com/Articles/14819/How-to-use-log4net

我寫了一篇關於如何使用正則表達式查找和替換橡皮布改變整個應用程序中使用另一種語法記錄的文章。請參閱this previous answerthis blog article

+0

+1感謝答案,我會看它太 – Zavael 2012-02-20 12:16:53

+0

是爲我寫的,我會看看它,看看哪些套房最適合我。如果我也可以檢查這個答案是否正確,我會這麼做:)也許在嘗試後我會改變主意;) – Zavael 2012-02-20 14:22:35