Logging Application Block
一、 日志应用程序块Logging Application Block 简介
开发人员经常编写需要日志功能的应用程序。这些应用程序在响应应用程序的事件中格式化并记录日志信息。例如,开发人员 经常编写代码来记录在响应突发情况中的异常信息,如应用程序异常,或者连接数据库失败。开发人员还编写代码使用用例和场景在应用程序执行期间跟踪通过组件的流。
日志应用程序块通过提供少量易用的类和方法来简化应用程序的开发,这些类和方法封装了大量最常见的日志场景。这些场景包括:
- 组装和记录事件信息。
- 在事件中包含上下文信息。
- 跟踪应用程序的活动。
每个任务都以一致的风格进行处理,从特定日志提供程序中抽象出应用程序代码。
日志应用程序块(Logging Application Block )处理了开发人员在编写需要日志功能的应用程序块时面临的最常见的任务。这些任务按场景进行了组织。每个场景都给出了一个真实世界的例子,比如组装和触发来自代码的事件,讨论情况的特殊需要,并且给出了完整的实现代码。
根据这些场景组织这些任务的目的是为代码提供一些上下文。日志应用程序块(The Logging Application Block) 针对开发者在带有日志功能的应用程序开发中的不同情况使用不同的场景来展示代码的用途。而不是仅仅提供一组独立的方法。
场景如下:
- 组装和触发来自代码的事件
- 将日志消息和其他上下文信息进行组装
- 跟踪活动并传输上下文信息
- 在构造日志消息之前检查过滤器状态
- 为跟踪监听器配置选项
- 引导不同的事件类型到不同的跟踪监听程序
- 配置日志过滤器
- 配置来自中央位置被执行的日志
- 创建客户自定义的跟踪监听程序
如果应用程序需要记录日志信息到事件日志、 e-mail 、数据库、消息队列、 Windows Management Instrumentation (WMI) 、或者文件,最好考虑使用日志应用程序块提供这些功能,特别是如果需要基于分类和优先级过滤日志消息,如果需要格式化消息、或者如果修改消息的目的地而不要修改应用程序的代码时。日志应用程序块还设计为可扩展的,还包括了创建自定义格式化程序和跟踪监听程序的机制,可以用来适配它以满足应用程序的日志需求。
注意:日志应用程序块的格式化程序没有加密日志信息。跟踪监听程序目的地接收的是明文的日志信息。这意味着攻击者可以访问跟踪监听目的地来读取信息。可以防止未认证来访问敏感信息。一种方法是使用访问控制列表( ACL )来限制对文本文件的访问。还可以创建自定义的格式化程序加密日志信息。
Demo1 : 使用配置工具Edit Enterprise Library Configuration 记录日志信息
任务一:打开DataAccessApp 项目,也可以接着刚刚做的DataAccessApp 的项目。
1. 添加引用。选择DataAccessApp 项目,右键单击“引用”,单击“添加引用”。在添加引用对话框中指向“浏览”,选择 Microsoft.Practices.EnterpriseLibrary.Logging.dll ,然后单击“确定”。如图1.1 所示。
图1.1 添加引用
2. 在MainForm.cs 文件中添加如下命名空间。
using Microsoft.Practices.EnterpriseLibrary.Logging;
3. 添加如下代码到MainForm.cs 文件中
private void btnOK_Click(object sender,System.EventArgs e)
{
try
{
// 使用Enterprise Library
db = DatabaseFactory .CreateDatabase();
DataSet ds = db.ExecuteDataSet(CommandType .Text, "select * from tb_User" );
dg.DataSource = ds.Tables[0];
}
catch (SqlException ex)
{
// 调用DataAccessLog() 方法
MyLogger .DataAccessErrorLog( ex.Message .ToString ());
}
MyLogger .DataAccessLog("DataBase Access" );
}
4. 添加MyLogger 类。右键单击项目DataAccessApp ,选择“添加”,指向“新建项”,在弹出的添加新项对话框中选择“类”,名称为MyLogger.cs 。如图1.2 所示
图1.2 添加新类
5. 在MyLogger.cs 类中输入如下代码
namespace DataAccessApp
{
class MyLogger
{
public struct Priority
{
public const int Lowest = 0;
public const int Low = 1;
public const int Normal = 2;
public const int High = 3;
public const int Highest = 4;
}
public struct Category
{
public const string General = "General" ;
public const string Trace = "Trace" ;
}
// 创建日志项
public static void DataAccessLog(string message)
{
try
{
LogEntry log = new LogEntry ();
log.EventId = 100;
log.Priority = 5;
log.Message = message;
log.Categories.Add(Category .General);
log.Priority = Priority .Normal;
Logger .Write(log);
}
catch (Exception e)
{
MessageBox .Show(e.Message);
}
}
public static void DataAccessErrorLog(string message)
{
try
{
LogEntry log = new LogEntry ();
log.EventId = 100;
log.Priority = 2;
log.Message = message;
log.Categories.Add(Category .General);
log.Priority = Priority .High ;
Logger .Write(log);
}
catch (Exception e)
{
MessageBox .Show(e.Message);
}
}
}
}
6. 在MainForm.cs 窗体中输入如下代码。
任务二:配置Loging Application Blocking 。
1. 右键单击App.config 文件,选择“Edit Enterprise Library Configuration ”。如图1.3 所示。
图1.3 在Edit Enterprise Library Configuration 中打开App.config
2. 在Edit Enterprise Library Configuration 中增加Logging Application Block 。右键单击能够代表App.config 的节点,指向New , 选择Logging Application Block. 如图1.4
图1.4 增加Logging Application Block 节点
3. 将Logging Application Block|Trace Listeners|Formatted EventLog Trace Listener 的Source 属性改为 DataAccessAppLogging 。其他项都保存默认。
任务三:运行程序。打开事件查看器,并刷新,如图1.5 所示。
图1.5 运行