龙空技术网

Quartz.NET总结(八)完整的Topshelf 服务配置

章为忠学架构 147

前言:

而今咱们对“quartznetlog”可能比较关注,姐妹们都想要剖析一些“quartznetlog”的相关知识。那么小编同时在网上汇集了一些对于“quartznetlog””的相关资讯,希望小伙伴们能喜欢,你们一起来学习一下吧!

前面讲了如何使用Topshelf 快速开发windows服务, 不清楚的可以看之前的这篇文章: ,今天说一说Topshelf 的相关配置。

Topshelf Configuration 简单配置

官方文档,对HostFactory 里面的参数做了详细的说明: ,下面只对一些常用的方法进行简单的解释:

我们将上面的程序代码改一下:

  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区别。不再细说。

Service Configuration 服务配置

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>

推荐使用第二种常用模式。

标签: #quartznetlog