Quartz.NET總結(八)如何根據自己需要配置Topshelf 服務
阿新 • • 發佈:2020-01-10
前面講了如何使用Topshelf 快速開發windows服務, 不清楚的可以看之前的這篇文章:https://www.cnblogs.com/zhangweizhong/category/771057.html,
今天說一說Topshelf 的相關配置。
簡單配置
官方文件,對HostFactory 裡面的引數做了詳細的說明:http://docs.topshelf-project.com/en/latest/configuration/config_api.html ,下面只對一些常用的方法進行簡單的解釋:
我們將上面的程式程式碼改一下:
HostFactory.Run(x => //1 { x.Service<TownCrier>(s => //2 { s.ConstructUsing(name => new TownCrier()); //配置一個完全定製的服務,對Topshelf沒有依賴關係。常用的方式。 //the start and stop methods for the service s.WhenStarted(tc => tc.Start()); //4 s.WhenStopped(tc => tc.Stop()); //5 }); x.RunAsLocalSystem(); // 服務使用NETWORK_SERVICE內建帳戶執行。身份標識,有好幾種方式,如:x.RunAs("username", "password"); x.RunAsPrompt(); x.RunAsNetworkService(); 等 x.SetDescription("Sample Topshelf Host服務的描述"); //安裝服務後,服務的描述 x.SetDisplayName("Stuff顯示名稱"); //顯示名稱 x.SetServiceName("Stuff服務名稱"); //服務名稱 });
重灌安裝執行後:
通過上面,相信大家都很清楚 SetDescription、SetDisplayName、SetServiceName區別。不再細說。
服務配置
Topself的服務一般有主要有兩種使用模式。
一、簡單模式。繼承ServiceControl介面,實現該介面即可。
例項:
namespace TopshelfDemo { public class TownCrier : ServiceControl { private Timer _timer = null; readonly ILog _log = LogManager.GetLogger(typeof(TownCrier)); public TownCrier() { _timer = new Timer(1000) { AutoReset = true }; _timer.Elapsed += (sender, eventArgs) => _log.Info(DateTime.Now); } public bool Start(HostControl hostControl) { _log.Info("TopshelfDemo is Started"); _timer.Start(); return true; } public bool Stop(HostControl hostControl) { throw new NotImplementedException(); } } class Program { public static void Main(string[] args) { var logCfg = new FileInfo(AppDomain.CurrentDomain.BaseDirectory + "log4net.config"); XmlConfigurator.ConfigureAndWatch(logCfg); HostFactory.Run(x => { x.Service<TownCrier>(); x.RunAsLocalSystem(); x.SetDescription("Sample Topshelf Host服務的描述"); x.SetDisplayName("Stuff顯示名稱"); x.SetServiceName("Stuff服務名稱"); }); } } }
二、常用模式。
例項:
namespace TopshelfDemo { public class TownCrier { private Timer _timer = null; readonly ILog _log = LogManager.GetLogger(typeof(TownCrier)); public TownCrier() { _timer = new Timer(1000) { AutoReset = true }; _timer.Elapsed += (sender, eventArgs) => _log.Info(DateTime.Now); } public void Start() { _timer.Start(); } public void Stop() { _timer.Stop(); } } class Program { public static void Main(string[] args) { var logCfg = new FileInfo(AppDomain.CurrentDomain.BaseDirectory + "log4net.config"); XmlConfigurator.ConfigureAndWatch(logCfg); HostFactory.Run(x => { x.Service<TownCrier>(s => { s.ConstructUsing(name => new TownCrier()); s.WhenStarted(tc => tc.Start()); s.WhenStopped(tc => tc.Stop()); }); x.RunAsLocalSystem(); x.SetDescription("Sample Topshelf Host服務的描述"); x.SetDisplayName("Stuff顯示名稱"); x.SetServiceName("Stuff服務名稱"); }); } } }
兩種方式,都使用了Log4Net,相關配置:
<? 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"> <!--日誌路徑--> <param name = "File" value= "D:\App_Data\servicelog\"/> <!--是否是向檔案中追加日誌--> <param name= "AppendToFile" value= "true"/> <!--log保留天數--> <param name= "MaxSizeRollBackups" value= "10"/> <!--日誌檔名是否是固定不變的--> <param name= "StaticLogFileName" value= "false"/> <!--日誌檔名格式為:2008-08-31.log--> <param name= "DatePattern" value= "yyyy-MM-dd".log=""""/> <!--日誌根據日期滾動--> <param name= "RollingStyle" value= "Date"/> <layout type="log4net.Layout.PatternLayout"> <param name="ConversionPattern" value="%d[% t] %-5p %c - %m%n %loggername" /> </layout> </appender> <!-- 控制檯前臺顯示日誌 --> <appender name="ColoredConsoleAppender" type="log4net.Appender.ColoredConsoleAppender"> <mapping> <level value="ERROR" /> <foreColor value="Red, HighIntensity" /> </mapping> <mapping> <level value="Info" /> <foreColor value="Green" /> </mapping> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%n%date{HH:mm:ss,fff} [%-5level] %m" /> </layout> <filter type="log4net.Filter.LevelRangeFilter"> <param name="LevelMin" value="Info" /> <param name="LevelMax" value="Fatal" /> </filter> </appender> <root> <!--(高) OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL (低) --> <level value="all" /> <appender-ref ref="ColoredConsoleAppender"/> <appender-ref ref="RollingLogFileAppender"/> </root> </log4net> </configuration>
推薦使用第二種常用模式。