如何為Windows服務增加Log4net和EventLog的日志功能。


一、簡介

    最近在做一個項目的時候,需要該項目自動啟動、自動運行,不需要認為干預。不用說,大家都知道用什么技術,那就是 Windows服務。在以前的Net Framework 平台下,Windows 服務是一個不錯的選擇。如果現在在Net Core版本,或者Net5.0以及以上版本,我們會有另外一個選擇,這就是 Worker Service,中文叫:輔助角色服務。它使用起來,維護起來更方便。話好像有點跑題了。我們言歸正傳,當我們做了一個Windows服務的進程來承載程序,還有另外一個工作需要做。那就是需要讓我們的服務程序告訴我們,程序是否運行正常,干了什么,沒有干什么,執行了哪些步驟,說道這些,就是我們所說的,要給Windows服務增加日志功能。

    為了給Windows服務增加日志功能,我們今天選擇了兩個日志組件,第一:EventLog,第二:Log4net。

    開發環境:

        開發工具:Visual Studio 2019

        開發語言:C#

 

二、具體操作

    1、為項目增加 EventLog 功能

        1.1、創建 Windows 服務項目。

            我們打開 Visual Studio 2019,在首頁上選擇“創建新項目”

            

            點擊《創建新項目》,進入《創建新項目》窗體,可以在左側選擇使用過的模板,也可以在右側選擇我們需要的模板。

            

            點擊《下一步》,進入《配置新項目》窗口,輸入項目名稱,解決方案名稱和項目的保存路徑地址。

            

            點擊《創建》,開始創建項目和解決方案。

            

        1.2、修改Service1.cs文件名稱為《MyWindowsService.cs》,並在服務的設計窗口中添加工具EventLog,在《工具欄》中打開組件《EventLog》,並將其拖到我們服務之上。

            

        1.3、然后在我們服務的構造函數中增加一下代碼。 

            

  1 using System;
  2 using System.Diagnostics;
  3 using System.IO;
  4 using System.ServiceProcess;
  5 using System.Timers;
  6 
  7 namespace PatrickLiu.WindowsService.RfcPlatform
  8 {
  9     /// <summary>
 10     /// 我們定義的 Windows 服務。
 11     /// </summary>
 12     public partial class MyWindowsService : ServiceBase
 13     {
 14         private static readonly log4net.ILog logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
 15 
 16         private int eventId = 1;
 17 
 18         /// <summary>
 19         /// 服務的構造函數
 20         /// </summary>
 21         public MyWindowsService()
 22         {
 23             //記錄到event log中,地址是 C:\Windows\System32\winevt\Logs (雙擊查看即可,文件名為MyNewLog)
 24             InitializeComponent();
 25             if (!System.Diagnostics.EventLog.SourceExists("PatrickLiuEventSource"))
 26             {
 27                 System.Diagnostics.EventLog.CreateEventSource("PatrickLiuEventSource", "PatrickLog");
 28             }
 29             MyEventLog.Source = "PatrickLiuEventSource";
 30             MyEventLog.Log = "PatrickLog";            
 31         }
 32 
 33         /// <summary>
 34         /// 服務開始啟動。
 35         /// </summary>
 36         /// <param name="args"></param>
 37         protected override void OnStart(string[] args)
 38         {
 39             logger.Info("服務啟動,啟動時間:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
 40             MyEventLog.WriteEntry("開啟服務。");
 41             Log("In OnStart.");
 42 
 43             #region 可以定義個人的服務
 44 
 45             Timer timer = new Timer();
 46             timer.Interval = 60000; // 60 seconds 60秒執行一次
 47             timer.Elapsed += new ElapsedEventHandler(OnTimer);
 48             timer.Start();
 49 
 50             #endregion
 51         }
 52 
 53         /// <summary>
 54         /// 服務開始關閉
 55         /// </summary>
 56         protected override void OnStop()
 57         {
 58             logger.Info("服務停止,停止時間:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
 59             MyEventLog.WriteEntry("關閉服務。");
 60 
 61             #region 可以定義要結束服務要做的事情。
 62 
 63             Log("In OnStop.");
 64 
 65             #endregion
 66         }
 67 
 68         /// <summary>
 69         /// 繼續服務
 70         /// </summary>
 71         protected override void OnContinue()
 72         {
 73             logger.Info("服務暫停,暫停時間:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
 74             MyEventLog.WriteEntry("In OnContinue.");
 75             Log("In OnContinue.");
 76         }
 77 
 78         /// <summary>
 79         /// 定時器中定時執行的任務
 80         /// </summary>
 81         /// <param name="sender"></param>
 82         /// <param name="args"></param>
 83         public void OnTimer(object sender, ElapsedEventArgs args)
 84         {
 85             // TODO: Insert monitoring activities here.
 86             logger.Info("我開始運行了,時間:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
 87             MyEventLog.WriteEntry("我開始運行了!", EventLogEntryType.Information, eventId++);
 88             Log("the timer");
 89         }
 90 
 91         /// <summary>
 92         /// 記錄到指定路徑:D:\log.txt
 93         /// </summary>
 94         /// <param name="message"></param>
 95         private static void Log(string message)
 96         {
 97             using (FileStream stream = new FileStream("D:\\log.txt", FileMode.Append))
 98             using (StreamWriter writer = new StreamWriter(stream))
 99             {
100                 writer.WriteLine($"{DateTime.Now}:{message}");
101             }
102         }
103     }
104 }

 

        1.4、右鍵點擊我們的服務,添加安裝程序。

            

            

            項目目錄結構如下:

            

 

        1.5、修改安裝程序 serviceInstaller1 名稱為:MyServiceInstaller,右鍵,修改serviceName和Description。

            

 

        1.6、在 serviceProcessInstaller 上修改名稱,右鍵,修改 Account 為 LocalSystem。

            

 

        1.7、如果運行 InstallUtil命令,提示不是有效命令,要執行以下操作。跟着操作就可以。

 

        1.8、將【C:\Windows\Microsoft.NET\Framework64\v4.0.30319】這個項目文件的地址增加到環境變量中;如圖

             拷貝地址:C:\Windows\Microsoft.NET\Framework64\v4.0.30319
            

            在我的電腦圖標上右鍵點擊《屬性》,打開《系統》窗口,點擊左側《高級系統設置》,進入設置窗口。

            

            打開《環境變量》窗口,選擇《系統變量》,它可以作用域所有用戶。在《系統變量》窗口,查找《Path》,然后選擇編輯,把我們拷貝的目錄,復制到值最后,通過英文分號分割。

            

            確定關閉所有窗口,然后打開cmd窗口,輸入:installuils,看看怎么樣?和以下一樣就說明你可以繼續了。

            

            切記:安裝服務的時候,必須以管理員的身份運行。否則會有你意想不到錯誤。

        1.9、編譯解決方案和項目,開始安裝服務,首先我們以管理員身份運行cmd。

            進入到項目的目錄,執行 Installutil PatrickLiu.WindowsService.RfcPlatform.exe

            

 

        2.0、打開服務管理器,啟動MyService服務,並且等待幾分鍾,然后卸載服務

           

        2.1、檢驗是否有效果

            

 

 

              好了,這一篇就到這里了。

    2、為項目增加Log4net 功能。

      2.1、項目和上面的項目是同一個,我們在該目錄下增加文件夾,名稱為:LogConfig,在該文件夾下增加配置文件,名稱:log4net.config

          

 

          log4.net.config 內容:          

 1 <?xml version="1.0" encoding="utf-8" ?>
 2 <log4net>
 3   <appender name="DebugAppender" type="log4net.Appender.DebugAppender" >
 4     <layout type="log4net.Layout.PatternLayout">
 5       <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
 6     </layout>
 7   </appender>
 8   <!--指定日記記錄方式,以滾動文件的方式(文件記錄)-->
 9   <appender name="RollingFile" type="log4net.Appender.RollingFileAppender">
10     <!--日志路徑-->
11     <file value="LogFiles\log-" />
12     <!--是否是向文件中追加日志-->
13     <appendToFile value="true" />
14     <!--log保留天數-->
15     <param name= "MaxSizeRollBackups" value= "10"/>
16     <!--每個文件最大1M-->
17     <param name="maximumFileSize" value="1MB" />
18     <!--日志根據日期滾動-->
19     <param name="RollingStyle" value="Date" />
20     <!--日志文件名格式為:logs_20080831.log-->
21     <param name="DatePattern" value="yyyyMMdd&quot;.log&quot;"/>
22     <!--日志文件名是否是固定不變的-->
23     <param name="StaticLogFileName" value="false" />
24     <!--布局-->
25     <layout type="log4net.Layout.PatternLayout">
26       <conversionPattern value="%date %5level %logger.%method [%line] - MESSAGE: %message%newline %exception" />
27     </layout>
28   </appender>
29   <root>
30     <level value="ALL"/>
31     <appender-ref ref="DebugAppender" />
32     <appender-ref ref="RollingFile" />
33   </root>
34 </log4net>

 

            並且該文件的屬性設置為:復制到輸出目錄-》始終復制。

 

          

 

 

      2.2、第二步,我們要安裝 Log4net的組件,通過nuget來安裝。

           在項目的《引用》上點擊右鍵,選擇《管理 NuGet 程序包》

            

              然后,點擊《瀏覽》,在文本框中輸入要查找組件的名稱,在右側選擇安裝。

              

 

          2.3、配置 AssemblyInfo.cs 文件。              

              [assembly: log4net.Config.XmlConfigurator(ConfigFileExtension = "config", ConfigFile = "LogConfig/log4net.config", Watch = true)]

              截圖如下:
                                                

                 

      2.4、在我們Windows服務獲取Log4net 的實例。          

              private static readonly log4net.ILog logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

 

              

 

 

      2.3、完成之后,我們安裝 Windows服務,然后在項目的運行目錄里查看,確認日志是否啟用。

          我們要在此安裝服務,先要卸載服務。

            執行以下命令:先是切換目錄,然后執行命令:installutil /u PatrickLiu.WindowsService.RfcPlatform.exe

          

           然后,我們再次執行命令:installutil PatrickLiu.WindowsService.RfcPlatform.exe 重新安裝服務。

           

 

 

      2.4、Windows服務的安裝過程和上面都是一樣,所以這里就不重復了。

        2.5、確認log4net是否啟作用。 

          

            打開LogFIles目錄,我們看到了日志文件。

            

 

 

三、總結

    好了,今天就寫到這里了。俗話說的好,好記性不如爛筆頭,所以我就記錄下來,以防自己需要的時候查找使用。而且每步都是自己試驗過的。可以放心使用。不忘初心,繼續努力,老天不會辜負努力人的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM