練習3:建立并使用自定義LogFormatter
在本練習中将建立一個自定義的LogFormatter,并在應用程式中使用它。
第一步
打開EnoughPI.sln項目,預設的安裝路徑應該為C:\Program Files\Microsoft Enterprise Library January 2006\labs\cs\Logging\exercises\ex03\begin,并編譯。
第二步 建立自定義LogFormatter
1.在解決方案管理器中選擇Formatters\XmlFormatter.cs檔案,選擇View | Code菜單指令,添加如下命名空間。
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三) using Microsoft.Practices.EnterpriseLibrary.Common.Configuration;
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三)
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三) using Microsoft.Practices.EnterpriseLibrary.Logging;
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三)
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三) using Microsoft.Practices.EnterpriseLibrary.Logging.Configuration;
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三)
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三) using Microsoft.Practices.EnterpriseLibrary.Logging.Formatters;
2.添加如下代碼到XmlFormatter類中。
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三) [ConfigurationElementType(typeof(CustomFormatterData))]
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三)
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三) public class XmlFormatter : LogFormatter
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三)
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三) {
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三)
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三) private NameValueCollection Attributes = null;
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三)
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三)
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三)
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三) public XmlFormatter(NameValueCollection attributes)
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三)
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三) {
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三)
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三) this.Attributes = attributes;
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三)
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三) }
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三)
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三)
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三)
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三) public override string Format(LogEntry log)
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三)
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三)
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三)
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三) string prefix = this.Attributes["prefix"];
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三)
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三) string ns = this.Attributes["namespace"];
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三)
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三)
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三)
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三) using (StringWriter s = new StringWriter())
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三)
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三) {
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三)
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三) XmlTextWriter w = new XmlTextWriter(s);
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三)
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三) w.Formatting = Formatting.Indented;
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三)
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三) w.Indentation = 2;
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三)
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三)
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三)
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三) w.WriteStartDocument(true);
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三)
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三) w.WriteStartElement(prefix, "logEntry", ns);
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三)
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三) w.WriteAttributeString("Priority", ns,
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三)
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三) log.Priority.ToString(CultureInfo.InvariantCulture));
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三)
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三) w.WriteElementString("Timestamp", ns, log.TimeStampString);
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三)
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三) w.WriteElementString("Message", ns, log.Message);
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三)
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三) w.WriteElementString("EventId", ns,
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三)
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三) log.EventId.ToString(CultureInfo.InvariantCulture));
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三)
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三) w.WriteElementString("Severity", ns, log.Severity.ToString());
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三)
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三) w.WriteElementString("Title", ns, log.Title);
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三)
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三) w.WriteElementString("Machine", ns, log.MachineName);
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三)
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三) w.WriteElementString("AppDomain", ns, log.AppDomainName);
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三)
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三) w.WriteElementString("ProcessId", ns, log.ProcessId);
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三)
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三) w.WriteElementString("ProcessName", ns, log.ProcessName);
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三)
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三) w.WriteElementString("Win32ThreadId", ns, log.Win32ThreadId);
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三)
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三) w.WriteElementString("ThreadName", ns, log.ManagedThreadName);
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三)
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三) w.WriteEndElement();
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三)
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三) w.WriteEndDocument();
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三)
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三)
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三)
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三) return s.ToString();
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三)
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三) }
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三)
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三)
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三)
Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三) }
日志項将被格式化為XML格式,并且它期望接收兩個參數prefix和namespace。
3.選擇Build | Build Solution編譯整個解決方案。
第三步 使用自定義LogFormatter
1.在解決方案管理器中選擇項目EnoughPI的配置檔案App.config檔案,選擇View | Open With…菜單指令,選擇Enterprise Library Configuration并單擊OK按鈕。
2.選中Logging Application Block | Formatters節點,選擇Action | New | Custom Formatter菜單指令,并設定屬性Name的為Xml Formatter。
3.選擇Type屬性,單擊ellipses顯示Type Selector對話框。
4.從程式集EnoughPI.Logging中選擇XmlFormatter類并單擊OK按鈕。
在Type Selector清單中的類,來自于與Enterprise Library Configuration配置工具在同一目錄下的程式集,它們繼承于基類LogFormatter,并且有一個值為CustomTraceListenerData的特性ConfigurationElementType。
5.選擇Attributes屬性并單擊ellipses顯示EditableKeyValue Collection Editor。
6.添加如下鍵值對
Key = prefix, Value = x
Key = namespace, Value = EnoughPI/2.0
并單擊OK按鈕。
還記得在類XmlFormatter中期望接受的兩個參數prefix和namespace。
7.選擇Logging Application Block | Trace Listeners | Custom TraceListener節點,并設定屬性Formatter為Xml Formatter。
8.選擇File | Save All儲存配置,并關閉Enterprise Library Configuration工具。
9.選擇Debug | Start Without Debugging菜單指令并運作應用程式,EnoughPI程式用來計算∏的精度。在NumericUpDown控件中輸入你希望的精度并點選Calculate按鈕。可以看到日志項顯示在一個控制台視窗中。
完成後的解決方案代碼如C:\Program Files\Microsoft Enterprise Library January 2006\labs\cs\Logging\exercises\ex03\end所示。
注意根據Hands On Lab給出的時間建議,做完以上三個練習的時間應該為30分鐘。
本文轉自lihuijun51CTO部落格,原文連結:http://blog.51cto.com/terrylee/67636 ,如需轉載請自行聯系原作者