Enterprise Library 6——Using the Logging Application Block

隨夢而飛發表於2014-08-07

原文參考 http://msdn.microsoft.com/en-us/library/dn440731(v=pandp.60).aspx

一、簡介

日誌通常滿足兩個主要的要求:1、監控應用程式效能並提供資訊。效能方面,日誌可以監控程式內部發生了什麼,有時也監控程式外部發生了什麼。2、更重要的是用於審計。這種日誌可以跟蹤使用者的行為並且記錄使用者執行的一系列任務、讀取和修改的資訊、訪問的資源。

日誌模組是一個高靈活和可配置的解決方案,它允許以靈活多樣的方式建立和儲存日誌資訊於各種位置、分類並過濾資訊、收集除錯過程中的上下文資訊、審計跟蹤並記錄。

二、日誌模組能做什麼?

日誌模組可以使日誌功能和應用程式程式碼分離。它可以把日誌條目傳送到Windows 事件日誌、資料庫、文字檔案,也可以生成包含日誌資訊的郵件、windows訊息佇列等。也可以自定義傳送目的。應用程式中,僅需簡單地用合適的物件(如Logwriter)生成一個日誌條目,然後呼叫其方法把日誌條目寫入相應的目標位置。

1-An overview of the logging process and the objects in the Logging block

三、日誌的代價和額外的上下文資訊

無論怎樣實現日誌,它總會有一些效能影響。日誌模組提供了靈活的、高度可配置的日誌解決方案,並且經過精心設計來最小化效能影響。但是,你仍然需要知道這個影響,並且要考慮你的日誌方案會如何影響它,需要在需求之間平衡。

LogWriter自動收集一些像時間、應用程式、機器名字、程式ID等上下文資訊。為了最小化效能影響,LogWriter類快取了這些值並且採用了延遲最小化——即只有當被一個Listener實際使用時才去建立。
然而,收集額外的上下文資訊的代價是非常高的並且浪費寶貴的資源,這可能會影響效能。因此,在建立LogEntry時,只有指定需要某些不常用的資訊時,日誌模組才去收集。日誌模組中的四個類可以收集指定的上下文資訊,包括COM+、當前堆疊、執行時安全相關以及系統安全相關。LogEntry還有一個字典屬性允許程式設計師新增資訊。

四、怎樣使用Logging Block

其中的關鍵是建立日誌條目,然後呼叫方法把這個日誌條目寫入目標。

1、新增LoggingBlock的引用到專案中

需要新增的引用有Microsoft.Practices.EnterpriseLibrary. Logging.dll,如果日誌要寫入資料庫還要引用 Microsoft.Practices.EnterpriseLibrary. Logging.Database.dll

2、配置Loggin Block

配置Logging Block可以用程式碼的方法,也可以用配置工具,這裡介紹配置工具的方法。

Step1啟動配置工具。執行"EntLibConfig.exe",點選"File|Open"開啟目標程式的配置檔案(Web.configApp.config),開啟檔案後如圖1

 

1

Step2配置。如果左邊導航欄未出現"Logging Settings"節點則表明以前未進行過企業庫日誌相關的配置,此時點選"Blocks|Add Logging Settings",出現圖2介面:

2

如果是修改配置請右擊"Logging Settings"選擇"Show/Hide Application Block Elements"(或點選前面的三角符號)也會出現上圖。

檢視圖2,先不要管"Logging Filters",介面被兩條豎線劃分成左中右三個區域,左邊的是Category(日誌類別),中間的是Listener(儲存日誌檔案的載體),右邊是Formatter(日誌內容格式化器)。一個Category可以包含多個Listener,即一份日誌可以寫入多個載體中,一個Listener對應一個Formatter

Logging Target Listener 儲存日誌的監聽器,其中定義了日誌儲存的位置(日誌載體):資料庫、XML檔案、FlatFile(文字檔案)Windows事件等10個位置。點選"Logging Target Listeners"右方的"+"號,可以新增日誌載體。日誌載體可分為10種型別:

Log Message Formatters日誌內容格式器。用於設定日誌的格式。每一個Listener需要設定唯一一個Formatters,一個Formatters可以被多個Listener使用。

Categories分類。每一個分類都有一個名字,每一個分類中包含一個或者多個Listener。當呼叫LogWriter.Write()方法時,需要給該方法指定所使用的分類的名字(如果不指定分類的名字則使用預設分類)write方法根據分類的名字找到其中包含的Listener,把日誌內容寫到每一個Listener中,其內容根據Formatter進行格式設定。如果你的應用程式需要不同型別的日誌資訊,你可以定義多個分類,比如:應用程式警告可以定義一個分類,該分類中包含Windows Event Listener;而使用者的所有操作資訊寫到文字檔案中,這就需要定義另外一個分類,其中包含Flat File Listener

五、使用LogWriter建立和寫入日誌條目

1)使用LogWriterWrite方法時,首先獲得一個LogWriter例項,獲得該例項需要一個LoggingConfiguration物件作為引數。

LoggingConfiguration loggingConfiguration = BuildProgrammaticConfig();

LogWriter defaultWriter = new LogWriter(loggingConfiguration);

 

2)或者用LogWriterFactory類來自動讀取配置檔案,然後建立例項

LogWriterFactory logWriterFactory = new LogWriterFactory();
LogWriter logWriter = logWriterFactory.Create();

 

下面的幾個例子演示瞭如何使用Write方法

// Check if logging is enabled before creating log entries.
if (defaultWriter.IsLoggingEnabled())
{
  defaultWriter.Write("Log entry created using the simplest overload.");
  defaultWriter.Write("Log entry with a single category.", "General");
  defaultWriter.Write("Log entry with a category, priority, and event ID.",

					"General", 6, 9001);
  defaultWriter.Write("Log entry with a category, priority, event ID, "
                      + "and severity.", "General", 5, 9002,
                      TraceEventType.Warning);
  defaultWriter.Write("Log entry with a category, priority, event ID, "
                      + "severity, and title.", "General", 8, 9003,
                      TraceEventType.Warning, "Logging Block Examples");
}
else
{
  Console.WriteLine("Logging is disabled in the configuration.");
}

 

上面的內容對日誌相關的基本知識和總體思路進行了說明。後面的部分會對涉及到的某些知識詳細的介紹。

六、Categories

從該圖可以看到,其需要設定的內容不多,Name:分類的名稱。AutoFlush:設定為Ture時,每當呼叫Write()時,自動把日誌資訊寫到目標;設定為Flase時,呼叫Write()時,日誌僅僅寫入快取,當呼叫Listener的Flush方法時才寫入目標。Listeners是該分類包含的目標監聽器,可以根據需要新增多個監聽器。

相關文章