zoukankan      html  css  js  c++  java
  • Quartz.NET总结(八)如何根据自己需要配置Topshelf 服务

    前面讲了如何使用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服务名称");                       //服务名称
                });    

    重装安装运行后:

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

     

    通过上面,相信大家都很清楚 SetDescription、SetDisplayName、SetServiceName区别。不再细说。

    服务配置

    Topself的服务一般有主要有两种使用模式。

    一、简单模式。继承ServiceControl接口,实现该接口即可。

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

     

    实例:

    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服务名称");
                });
            }
        }
    }

    二、常用模式。

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

     

    实例:

    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_Dataservicelog"/>
          <!--是否是向文件中追加日志-->
          <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>

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

  • 相关阅读:
    偏函数 匿名函数 高阶函数 map filter reduce
    函数
    Python的字符串格式化
    集合
    列表 元组 字典
    字符串
    数字
    Python基础-杂项
    Java 和C/C++的“语法”上的差异!
    MySQL基础原创笔记(一)
  • 原文地址:https://www.cnblogs.com/zhangweizhong/p/12177680.html
Copyright © 2011-2022 走看看