本文演示Enterprise Library – Logging Application Block 日志管理模块的使用,以及如何创建和使用定制的TraceListener和LogFormatter。本文由http://blog.entlib.com 开源ASP.NET博客平台小组根据EntLib HOL手册编译提供,欢迎交流。
 
练习一:为应用程序添加日志记录功能
本文练习如何使用Logging Application Block,通过 EntLib 配置工具来配置TraceListener。
 
1. 首先打开\Enterprise Library 4.1 HOL\CS\Logging\exercises\ex01\begin目录下的EnoughPI.sln项目文件,该应用程序用来计算pi值。可以直接运行应用程序,如下图所示:
 
2. 添加记录日志功能
选择EnoughPI项目,添加对logging dll的引用:
Microsoft.Practices.EnterpriseLibrary.Logging.dll。
一般该dll在如下目录(根据安装选择的路径发生变化):
C:\Program Files\Microsoft Enterprise Library 4.1 - October 2008\Bin
 
打开Calc\Calculator.cs 代码文件,添加命名空间的引用:
using Microsoft.Practices.EnterpriseLibrary.Logging;
 
找到Calculator.cs代码文件中OnCalculated方法,添加如下代码:
        protected void OnCalculated(CalculatedEventArgs args)
        {
            LogEntry log = new LogEntry();
            log.Message = string.Format("Calculated PI to {0} digits", args.Digits);
            log.Categories.Add(Category.General);
            log.Priority = Priority.Normal;
 
            Logger.Write(log);
 
            if (Calculated != null)
                Calculated(this, args);
        }
上述代码创建了一个新的LogEntry对象,设置相关参数值,并使用Logger.Write方法将entry对象写入到一个或多个TraceListener。这里使用到了Constants.cs代码中定义的一些常量,如Category和Priority。
 
下面找到Calculator.cs代码文件中的OnCalculating方法,添加如下log日志代码:
        protected void OnCalculating(CalculatingEventArgs args)
        {
            Logger.Write(
                string.Format("Calculating next 9 digits from {0}", args.StartingAt),
                Category.General,
                Priority.Low
            );
 
            if (Calculating != null)
                Calculating(this, args);
 
            if (args.Cancel == true)
            {
                Logger.Write("Calculation cancelled by user!", Category.General, Priority.High);
            }
        }
上述代码使用了Logger.Write的重载方法,省略了创建一个LogEntry对象。
 
下面继续针对Calculator.cs文件中OnCalculatorException方法,记录异常信息,添加如下代码:
        protected void OnCalculatorException(CalculatorExceptionEventArgs args)
        {
            if (!(args.Exception is ConfigurationErrorsException))
            {
                Logger.Write(args.Exception, Category.General, Priority.High);
            }
 
            if (CalculatorException != null)
                CalculatorException(this, args);
        }
注意:确保Exception类型不是ConfigurationErrorsException,否则因为没有正确配置Logging Application Block,将不能Logger来记录日志。一般情况下,我们使用Enterprise Library的Exception Handling Application Block来创建一致的异常处理策略。
 
3. 配置文件
使用EntLib 的Enterprise Library Configuration工具打开app.config配置文件,添加Logging Application Block配置项。
 

 
默认的Logging Application Block 配置项定义了一个General 的Category Source,General 目录有一个TraceListener的引用,名称为Formatted EventLog TraceListener。可以点击Category Sources节点,添加新的Category。
 
选择Logging Application Block | Trace Listeners | Formatted EventLog TraceListener 节点,设置Source 属性为 EnoughPI(注意:Source需要在Event Log中注册,在第一次使用时,Event Log Trace Listener自动注册一个新的Source,但是需要有管理员的权限,因此第一次需要以管理员的权限运行该应用程序)。
 

 
保存上述对app.config 文件的更新。
 
4. 运行范例程序
从事件日志(Event Log)查看生成的log记录。
 
 
5. 为应用程序添加跟踪功能
打开Calc\Calculator.cs 文件,添加tracing代码。
        public string Calculate(int digits)
        {
            StringBuilder pi = new StringBuilder("3", digits + 2);
            string result = null;
 
            try
            {
                if (digits > 0)
                {
                    using (new Tracer(Category.Trace))
                    {
                        pi.Append(".");
                        for (int i = 0; i < digits; i += 9)
                        {
                            CalculatingEventArgs args;
                            args = new CalculatingEventArgs(pi.ToString(), i + 1);
                            OnCalculating(args);
 
                            // Break out if cancelled
                            if (args.Cancel == true) break;
 
                            // Calculate next 9 digits
                            int nineDigits = NineDigitsOfPi.StartingAt(i + 1);
                            int digitCount = Math.Min(digits - i, 9);
                            string ds = string.Format("{0:D9}", nineDigits);
                            pi.Append(ds.Substring(0, digitCount));
                        }
                    }
                }
 
                result = pi.ToString();
 
                // Tell the world I've finished!
                OnCalculated(new CalculatedEventArgs(result));
            }
            catch (Exception ex)
            {
                // Tell the world I've crashed!
                OnCalculatorException(new CalculatorExceptionEventArgs(ex));
            }
 
            return result;
        }
我们经常需要记录应用程序不同部分的运行时间,Logging Application Block的Tracing功能提供了对代码块记录执行时间的功能。Tracer对象在销毁时,会停止计时,并记录结束跟踪的消息。using 代码块可以确保在代码结束时,调用Tracer对象的Dispose() 方法。
 
再次使用EntLib的配置工具打开app.config配置文件,选择Logging Application Block节点,设置TracingEnabled属性为True(默认为True)。
 
选择Logging Application Block | Trace Listeners 节点,添加新的FlatFile TraceListener。
 
 
并设置Formatter属性为Text Formatter,如下图所示。
 
 
选择 Logging Application Block | Category Sources 节点,添加一个新的Category,并设置相应的属性。
Name = Trace
SourceLevels = ActivityTracing
 

 
这里的Trace Category 在前面的代码中有使用到,ActivityTracing 限制仅仅在开始和结束时跟踪日志。
 
右键点击上一步创建的Trace Category,添加新的Trace Listener引用,并设置ReferencedTraceListener属性为 FlatFile TraceListener。其实,就是引用前一步创建的FlatFile TraceListener。
 

 
保存app.config配置文件。
 
6. 再次运行范例程序,检查trace.log文件。
在应用程序的bin目录下,可以找到trace.log文件,记录了trace 开始和结束的相关信息,如下图所示。
 
 
http://www.entlib.com专业ASP.NET电子商务平台小组,欢迎你继续访问下一节内容。
 
参考文档:
Logging Application Block Hands-On Labs for Enterprise Library
posted on 2010-09-15 09:54  vibratea  阅读(413)  评论(0编辑  收藏  举报