技术开发 频道

VS2010与Win7共舞:ETW自定义程序日志

  使用Event Log记录简单日志

  为了便于在我们开发的应用程序中使用ETW,在Visual Studio 2010中,.NET Framework 在 System.Diagnosis 下提供了EventLog类来进行简单的事件输出,我们可以利用这个类来记录简单的应用程序日志,以代替应用程序的日志系统。

  我们还是以上一篇文章中的文件复制程序作为例子,利用Event Log输出复制文件所花费的时间以帮助我们找到程序性能低下的原因。

  首先我们在类中添加一个EventLog的成员变量:

// EventLog成员变量
private static EventLog copyLog;

  然后,我们需要在类的初始化函数中对其进行初始化:

   public MainForm()
        {
            
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";

  这样,我们所记录的日志就会出现在自定义的日志分类下,更加便于我们对日志进行分析整理。

  完成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));
                }
            };

  现在,我们以管理员身份编译和运行这个程序,在文件复制过程中,EventLog就会将复制的文件名和耗时作为事件的内容记录到日志中。通过分析日志,我们可以知道在复制哪一个文件时耗时最多,从而可以进行更加有针对性的诊断和调试。

  图2  利用EventLog记录的事件

0
相关文章