一,新建.netcore控制台應用程序。本文使用.netcore2.2版本,結構如下
二,negut引用Topshelf.Log4Net,Topshelf
三,代碼如下:
1>Program.cs
using log4net.Config; using System; using System.IO; using Topshelf; namespace TopShelfWs { class Program { static void Main(string[] args) { HostFactory.Run(x => { x.Service<ServiceHandler>(s => { s.ConstructUsing(name => new ServiceHandler()); s.WhenStarted(tc => tc.Start()); s.WhenStopped(tc => tc.Stop()); }); x.RunAsLocalSystem(); x.SetDescription("Sample Topshelf Host"); x.SetDisplayName("TopshelfWs"); x.SetServiceName("TopshelfWs"); x.UseLog4Net("log4net.config"); }); } } }
2>ServiceHandler.cs
using log4net; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.ServiceProcess; using System.Text; using System.Timers; namespace TopShelfWs { partial class ServiceHandler { readonly Timer _timer; readonly ILog _log = LogManager.GetLogger(typeof(ServiceHandler)); public ServiceHandler() { _timer = new Timer(1000) { AutoReset = true }; _timer.Elapsed += new ElapsedEventHandler(OnTick); _timer.Elapsed += (sender, eventArgs) => Console.WriteLine("當前時間:", DateTime.Now); } protected virtual void OnTick(object sender, ElapsedEventArgs e) { _log.Debug("Tick:" + DateTime.Now.ToLongTimeString()); } public void Start() { _log.Info("Service is Started"); _timer.Start(); } public void Stop() { _log.Info("Service is Stopped"); _timer.Stop(); } } }
3>log4net.config
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" /> </configSections> <log4net> <!--定義輸出到文件中--> <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender"> <!--定義文件存放位置--> <file value="log\\"/> <!--是否追加到文件,默認為true,通常無需設置--> <appendToFile value="true"/> <!--多線程時采用最小鎖定--> <lockingModel type="log4net.Appender.FileAppender+MinimalLock"/> <!--變換的形式為日志大小--> <!--這種情況下MaxSizeRollBackups和maximumFileSize的節點設置才有意義--> <!--<rollingStyle value="Size"/>--> <!--每天記錄的日志文件個數,與maximumFileSize配合使用--> <!--<MaxSizeRollBackups value="10"/>--> <!--每個日志文件的最大大小--> <!--可用的單位:KB|MB|GB--> <!--不要使用小數,否則會一直寫入當前日志--> <!--<maximumFileSize value="2MB"/>--> <!--變換的形式為日期,這種情況下每天只有一個日志--> <!--此時MaxSizeRollBackups和maximumFileSize的節點設置沒有意義--> <rollingStyle value="Date"/> <!--每分鍾寫一個文件--> <!--<datePattern value="yyyyMMdd-HHmm" />--> <!--日期的格式,每天換一個文件記錄,如不設置則永遠只記錄一天的日志,需設置--> <datePattern value="yyyyMMdd\\HH'.txt'"/> <staticLogFileName value="false"/> <param name="MaxSizeRollBackups" value="100"/> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%newline %n記錄時間:%date %n描述:%message"/> <!--<conversionPattern value="%newline %n記錄時間:%date %n線程ID:[%thread] %n日志級別: %-5level %n出錯類:%logger property: [%property{NDC}] - %n錯誤描述:%message%newline %n"/>--> </layout> </appender> <!--定義輸出到MySql中--> <!--注意 Mysql.data 引用屬性中復制本地一定要選True--> <appender name="AdoNetAppender_MySql" type="log4net.Appender.AdoNetAppender"> <bufferSize value="100"/> <param name="ConnectionType" value="MySql.Data.MySqlClient.MySqlConnection, MySql.Data"/> <param name="ConnectionString" value="server=localhost;database=test;uid=root;pwd=maocaiming;"/> <commandText value="INSERT INTO mylog111 (log_datetime,log_thread,log_level,log_logger,log_message,Exception) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)"/> <parameter> <parameterName value="@log_date"/> <dbType value="DateTime"/> <layout type="log4net.Layout.RawTimeStampLayout"/> </parameter> <parameter> <parameterName value="@thread"/> <dbType value="String"/> <size value="255"/> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%thread"/> </layout> </parameter> <parameter> <parameterName value="@log_level"/> <dbType value="String"/> <size value="50"/> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%level"/> </layout> </parameter> <parameter> <parameterName value="@logger"/> <dbType value="String"/> <size value="255"/> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%logger"/> </layout> </parameter> <parameter> <parameterName value="@message"/> <dbType value="String"/> <size value="4000"/> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%message"/> </layout> </parameter> <parameter> <parameterName value="@exception"/> <dbType value="String"/> <size value="2000"/> <layout type="log4net.Layout.ExceptionLayout"/> </parameter> </appender> <root> <!--控制級別,由低到高: ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF--> <!--比如定義級別為INFO,則INFO級別向下的級別,比如DEBUG日志將不會被記錄--> <!--如果沒有定義LEVEL的值,則缺省為DEBUG--> <level value="ALL"/> <!--文件形式記錄日志--> <appender-ref ref="RollingLogFileAppender"/> <!--<appender-ref ref="AdoNetAppender_MySql"/>--> </root> </log4net> </configuration>
四,發布項目配置
五,生成成功后,我們使用nssm部署服務
下載nssm,下載地址http://www.nssm.cc/download
六,使用命令啟動nssm
cd C:\Users\May\Desktop\nssm-2.24\win64
nssm install TopShelfWs
七,打開如下:
八,選擇生成的文件目錄:(C:\Users\May\Desktop\ws)
九,生成服務
右鍵啟動服務,即可看到生成的日志文件
十,移除服務: nssm remove TopShelfWs//刪除創建的TopShelfWs服務
十一,刷新后發現生成的服務已經刪除
PS :如果啟用服務出現如下圖問題:
原因是nssm install TopShelfWs 這個啟用服務的名字跟 代碼中 x.SetServiceName("TopShelfWs"); 相同,或者這句話被注釋掉,總結問題原因:1,名字相同(TopShelfWs),2,代碼被注釋掉
參考博客
https://www.cnblogs.com/uptothesky/p/5318420.html
http://www.cnblogs.com/hai-cheng/p/8670395.html