天天看點

Enterprise Library 2.0 Hands On Lab 翻譯(6):日志應用程式塊(三)

練習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 ,如需轉載請自行聯系原作者