使用Event Log记录简单日志
为了便于在我们开发的应用程序中使用ETW,在Visual Studio 2010中,.NET Framework 在 System.Diagnosis 下提供了EventLog类来进行简单的事件输出,我们可以利用这个类来记录简单的应用程序日志,以代替应用程序的日志系统。
我们还是以上一篇文章中的文件复制程序作为例子,利用Event Log输出复制文件所花费的时间以帮助我们找到程序性能低下的原因。
首先我们在类中添加一个EventLog的成员变量:
// EventLog成员变量
private static EventLog copyLog;
private static EventLog copyLog;
然后,我们需要在类的初始化函数中对其进行初始化:
public MainForm()
{
this.InitializeComponent();
//
// …
// 创建并初始化EventLog对象
copyLog = new EventLog();
copyLog.Source = "FileCopyApp";
///
// …
}
{
this.InitializeComponent();
//
// …
// 创建并初始化EventLog对象
copyLog = new EventLog();
copyLog.Source = "FileCopyApp";
///
// …
}
默认情况下,我们通过这种方式输出的EventLog会出现在Event Viewer(事件查看器)的Application(应用程序)分类下,如果我们想让日志出现在其他分类或者自定义的分类,可以使用CreateEventSource方法将事件源添加到当前事件中。例如:
EventLog copyLog = new EventLog("MyLog");
// 首先应判断日志来源是否存在
// 如果存在,则删除已有的日志来源
// 一个日志来源只能同时与一个事件绑定
if ( EventLog.SourceExists("FileCopyApp") )
{
EventLog.DeleteEventSource("FileCopyApp");
}
EventLog.CreateEventSource("FileCopyApp", "MyLog");
// 指定日志来源
copyLog.Source = "FileCopyApp";
// 首先应判断日志来源是否存在
// 如果存在,则删除已有的日志来源
// 一个日志来源只能同时与一个事件绑定
if ( EventLog.SourceExists("FileCopyApp") )
{
EventLog.DeleteEventSource("FileCopyApp");
}
EventLog.CreateEventSource("FileCopyApp", "MyLog");
// 指定日志来源
copyLog.Source = "FileCopyApp";
这样,我们所记录的日志就会出现在自定义的日志分类下,更加便于我们对日志进行分析整理。
完成EventLog对象的创建后,我们就可以开始在文件复制过程中进行日志的记录了,在这里,我们记录每个被复制的文件的名字以及复制这个文件的耗时。
// 创建后台复制线程
this.worker = new BackgroundWorker();
// 执行复制
this.worker.DoWork += (o, e) =>
{
string[] files = Directory.GetFiles(source);
for (int i = 0; i < files.Length; ++i)
{
// 记录文件复制开始时间
DateTime startTime = DateTime.Now;
Thread.Sleep(1000);
// 执行复制
File.Copy(files[i], Path.Combine(dest, Path.GetFileName(files[i])));
// 计算复制过程耗时
TimeSpan timeDiff = ( DateTime.Now - startTime );
Int32 dDiff = (Int32)timeDiff.TotalSeconds ;
// 输出日志
copyLog.WriteEntry("复制:" + files[i] +
" 耗时:" + dDiff.ToString(),
EventLogEntryType.Information);
this.worker.ReportProgress((int)((100.0f * i) / files.Length));
}
};
this.worker = new BackgroundWorker();
// 执行复制
this.worker.DoWork += (o, e) =>
{
string[] files = Directory.GetFiles(source);
for (int i = 0; i < files.Length; ++i)
{
// 记录文件复制开始时间
DateTime startTime = DateTime.Now;
Thread.Sleep(1000);
// 执行复制
File.Copy(files[i], Path.Combine(dest, Path.GetFileName(files[i])));
// 计算复制过程耗时
TimeSpan timeDiff = ( DateTime.Now - startTime );
Int32 dDiff = (Int32)timeDiff.TotalSeconds ;
// 输出日志
copyLog.WriteEntry("复制:" + files[i] +
" 耗时:" + dDiff.ToString(),
EventLogEntryType.Information);
this.worker.ReportProgress((int)((100.0f * i) / files.Length));
}
};
现在,我们以管理员身份编译和运行这个程序,在文件复制过程中,EventLog就会将复制的文件名和耗时作为事件的内容记录到日志中。通过分析日志,我们可以知道在复制哪一个文件时耗时最多,从而可以进行更加有针对性的诊断和调试。
图2 利用EventLog记录的事件