一、簡介
最近在做一個項目的時候,需要該項目自動啟動、自動運行,不需要認為干預。不用說,大家都知道用什么技術,那就是 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】這個項目文件的地址增加到環境變量中;如圖

在我的電腦圖標上右鍵點擊《屬性》,打開《系統》窗口,點擊左側《高級系統設置》,進入設置窗口。
打開《環境變量》窗口,選擇《系統變量》,它可以作用域所有用戶。在《系統變量》窗口,查找《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".log""/> 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目錄,我們看到了日志文件。
三、總結
好了,今天就寫到這里了。俗話說的好,好記性不如爛筆頭,所以我就記錄下來,以防自己需要的時候查找使用。而且每步都是自己試驗過的。可以放心使用。不忘初心,繼續努力,老天不會辜負努力人的。