在Windows服务中使用EventLog组件纪录日志

1,在Service1.cs文件的设计窗口中添加工具EventLog

 private static Timer timer = new Timer();
        public Service1()
        {
            InitializeComponent();
               if (!System.Diagnostics.EventLog.SourceExists("MySource"))
           {
                 System.Diagnostics.EventLog.CreateEventSource(
                    "MySource", "MyNewLog");
           }
               eventLog1.Source = "MySource";
               eventLog1.Log = "MyNewLog";
 
        }

        protected override void OnStart(string[] args)
        {
              // TODO: 在此处添加代码以启动服务。  
            //初始化Timers
            timer.Interval = 12000;

            eventLog1.WriteEntry("开始日志纪录");

          
                  String s = System.DateTime.Now.ToString();  
                if(!File.Exists(@"C:\Users\ITCA\Desktop\MyWindowsServiceTest.txt"))  
                {
                     StreamWriter sr = File.CreateText(@"C:\Users\ITCA\Desktop\MyWindowsServiceTest.txt");  
                       sr.WriteLine("-------------------------START SRV---------------------");  
                       sr.WriteLine ("我的新服务在{0}时间开始",s);  
                      sr.WriteLine ("我可以写整型 {0} or 浮点型 {1},等等.",1, 4.2);
                      sr.Close(); 
               }  
                  else 
               {  
                      StreamWriter sr = File.AppendText(@"C:\Users\ITCA\Desktop\MyWindowsServiceTest.txt");  
                      sr.WriteLine("-------------------------START SRV---------------------");  
                      sr.Close();  
                 }

                timer.Enabled = true;
                timer.Start();
                timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);



        }

        void timer_Elapsed(object sender, ElapsedEventArgs e)
        {
            using (StreamWriter sw=File.AppendText (@"C:\Users\ITCA\Desktop\MyWindowsServiceTest.txt"))
            {
                sw.WriteLine("----------------"+DateTime.Now.ToString ()+"---------------------"+"\r\n");

                eventLog1.WriteEntry("-------------日志纪录中-----------------------");
            }
        }

        protected override void OnStop()
        {

             // TODO: 在此处添加代码以执行停止服务所需的关闭操作。

            //结束定时
            timer.Enabled = false;
            timer.Stop();
            eventLog1.WriteEntry("日志纪录结束");
                        String s1 = System.DateTime.Now.ToString();
                        if (!File.Exists(@"C:\Users\ITCA\Desktop\MyWindowsServiceTest.txt"))  
                       {  
                         StreamWriter sr = File.CreateText(@"C:\Users\ITCA\Desktop\MyWindowsServiceTest.txt");  
                         sr.WriteLine("-------------------------STOP SRV---------------------");  
                         sr.WriteLine ("我的新服务在{0}时间停止",s1);  
                        sr.Close();  
                       }  
                        else 
                        {  
                        StreamWriter sr = File.AppendText(@"C:\Users\ITCA\Desktop\MyWindowsServiceTest.txt");  
                        sr.WriteLine("-------------------------STOP SRV---------------------");  
                        sr.WriteLine ("我的新服务在{0}时间停止",s1);  
                        sr.Close();  
                        }
         


        }
}

  在

  public Service1()
        {
            InitializeComponent();
               if (!System.Diagnostics.EventLog.SourceExists("MySource"))
           {
                 System.Diagnostics.EventLog.CreateEventSource(
                    "MySource", "MyNewLog");
           }
               eventLog1.Source = "MySource";
               eventLog1.Log = "MyNewLog";
 
        }

  中 Service1的构造函数中  判断是否已经存在事件源MySource 如果存在指定EventLog的属性Source 和Log  这两个属性是自定义的  不存在就创建一个 System.Diagnostics.EventLog.CreateEventSource(                     "MySource", "MyNewLog");

                  在这里 事件源MySource并不须要我们写什么代码 它只是一个自定义的字符串 在   事件查看器  下  windows日志下

          应用程序中 显示  的日记来源 就是我们自定义的 MySource 

         系统中        (如果卸载了此服务 后会有一个来源为Eventlog的日志,任务类型为 日志清除 【在添加组件并设置eventlog属性时有一个属性 显示 卸载此服务时是否 清除日志】)

                      打开这个来源为Eventlog的日志         显示信息为  MyNewLog日志文件已被清除

 

 

然后在OnStart()和OnStop()方法中写自己的逻辑代码

在服务开启或关闭时时    eventlog1.WriteEntity("这里是写入日志的自定义内容");

也可以在定时器中 每隔一段时间报告状态  ,

2,在Service1.Designer.cs文件中时vs在我们 创建服务时自动生成的代码  

 partial class Service1
    {
        /// <summary> 
        /// 必需的设计器变量。
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// 清理所有正在使用的资源。
        /// </summary>
        /// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region 组件设计器生成的代码

        /// <summary> 
        /// 设计器支持所需的方法 - 不要
        /// 使用代码编辑器修改此方法的内容。
        /// </summary>
        private void InitializeComponent()
        {
            this.eventLog1 = new System.Diagnostics.EventLog();
            ((System.ComponentModel.ISupportInitialize)(this.eventLog1)).BeginInit();
            // 
            // Service1
            // 
            this.CanPauseAndContinue = true;
            this.CanShutdown = true;
            this.ServiceName = "MyWindowsService";
            ((System.ComponentModel.ISupportInitialize)(this.eventLog1)).EndInit();

        }

        #endregion

        private System.Diagnostics.EventLog eventLog1;

    }

  

在 组件设计器生成的代码  中

   #region 组件设计器生成的代码

        /// <summary> 
        /// 设计器支持所需的方法 - 不要
        /// 使用代码编辑器修改此方法的内容。
        /// </summary>
        private void InitializeComponent()
        {
            this.eventLog1 = new System.Diagnostics.EventLog();
            ((System.ComponentModel.ISupportInitialize)(this.eventLog1)).BeginInit();
            // 
            // Service1
            // 
            this.CanPauseAndContinue = true;
            this.CanShutdown = true;
            this.ServiceName = "MyWindowsService";
            ((System.ComponentModel.ISupportInitialize)(this.eventLog1)).EndInit();

        }

        #endregion

  添加  //             // Service1             //          

   this.CanPauseAndContinue = true;   //服务是否可以暂停 并在再继续      

    this.CanShutdown = true;     //系统关闭时通知服务

        this.ServiceName = "MyWindowsService";//指定服务名为  创建服务的项目名称

 

3,生服务组件  在Service1.cs中右击 

添加安装程序

单击eventlog组件  右击

添加安装程序

生成ProjectInstaller.cs文件

4,ProjectInstaller.cs文件中  选中组件  右击设置属性

            serviceInstaller1 中ServiceName 为MyWindowsService

 

                                  StartType 中  设如何启动Manual 手动  Automatic自动

             serviceProcessInstaller1中 Account账户类型 设置为  LocaSystem  本地账户

 

5,编译  生成 

 

6,安装服务

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2012-03-23 11:14  hhhker  阅读(3990)  评论(0编辑  收藏  举报