• 使用Topshelf创建Windows 服务


    使用Topshelf创建Windows 服务简要的介绍了创建Windows服务的另一种方法,老外的一篇文章Create a .NET Windows Service in 5 steps with Topshelf通过5个步骤详细的介绍使用使用Topshelf创建Windows 服务。Topshelf是一个开源的跨平台的宿主服务框架,支持Windows和Mono,只需要几行代码就可以构建一个很方便使用的服务宿主。

    1、Topshelf的代码托管在http://topshelf-project.com/,可以在这里下载到最新的代码。

    2、使用Visual Studio创建一个控制台应用程序引用程序集TopShelf.dll 合log4net.dll 。

    3、创建一个简单的服务类,里面包含两个方法Start和Stop,这个服务只是演示代码,所以我们每隔5秒输出一个日志。

    using System;
    using System.Timers;
    using log4net;

    namespace SampleWindowsService
    {
    public class SampleService
    {
    private Timer _timer = null;
    readonly ILog _log = LogManager.GetLogger(typeof(SampleService));

    public SampleService()
    {
    double interval = 5000;
    _timer = new Timer(interval);
    _timer.Elapsed += new ElapsedEventHandler(OnTick);
    }

    protected virtual void OnTick(object sender, ElapsedEventArgs e)
    {
    _log.Debug("Tick:" + DateTime.Now.ToLongTimeString());
    }

    public void Start()
    {
    _log.Info("SampleService is Started");

    _timer.AutoReset = true;
    _timer.Enabled = true;
    _timer.Start();
    }

    public void Stop()
    {
    _log.Info("SampleService is Stopped");

    _timer.AutoReset = false;
    _timer.Enabled = false;
    }
    }
    }
    4、在Main方法中使用Topshelf宿主我们的服务,主要是告诉Topshelf如何设置我们的服务的配置和启动和停止的时候的方法调用。
    using System.IO;
    using log4net.Config;
    using Topshelf;

    namespace SampleWindowsService
    {
    class Program
    {
    static void Main(string[] args)
    {
    XmlConfigurator.ConfigureAndWatch(
    new FileInfo(".\log4net.config"));

    var host = HostFactory.New(x =>
    {
    x.EnableDashboard();
    x.Service<SampleService>(s =>
    {
    s.SetServiceName("SampleService");
    s.ConstructUsing(name => new SampleService());
    s.WhenStarted(tc =>
    {
    XmlConfigurator.ConfigureAndWatch(
    new FileInfo(".\log4net.config"));
    tc.Start();
    });
    s.WhenStopped(tc => tc.Stop());
    });

    x.RunAsLocalSystem();
    x.SetDescription("SampleService Description");
    x.SetDisplayName("SampleService");
    x.SetServiceName("SampleService");
    });

    host.Run();
    }
    }
    }
    4、配置Log4net和运行我们的服务,服务可以当作控制台来运行,这在开发的时候是非常方便的。服务的安装很方便
    SampleWindowsService.exe install
    安装成功后,可以通过服务控制台启动,或者也可以通过一下命令运行
    SampleWindowsService.exe start
    服务的卸载方法也非常简单了
    SampleWindowsService.exe uninstall

    Topshelf 学习 跨平台
    Topshelf是一个开源的跨平台的宿主服务框架,支持Windows和Mono,只需要几行代码就可以构建一个很方便使用的服务宿主。

    官网:http://topshelf-project.com 

    GitHub:http://github.com/topshelf/Topshelf

    下面就开始来学习。

    创建项目
    1.新建一个控制台程序

    2.添加引用

    我们直接搜索 Topshelf log4net

    或者Nuget控制台:Install-Package Topshelf.Log4Net

    正常情况下 直接安装Topshelf 一个就可以了。Log4Net只是为了更好的方便记录日志。

    3.创建服务

    先创建一个类,继承 ServiceControl 然后实现。


    public class SampleService : ServiceControl
    {
    LogWriter _log;
    Timer _timer;
    public SampleService()
    {
    _log = HostLogger.Get<SampleService>();
    _timer = new Timer(1000) { AutoReset = true };
    _timer.Elapsed += (sender, eventArgs) => _log.Info(DateTime.Now);
    }

    public bool Start(HostControl hostControl)
    {
    _log.Info("服务启动");
    _timer.Start();
    return true;
    }

    public bool Stop(HostControl hostControl)
    {
    _log.Info("服务停止");
    _timer.Stop();
    return true;
    }
    }

    LogWriter 需要using Topshelf.Logging;

    4.调用

    然后再Main中调用


    static void Main(string[] args)
    {
    HostFactory.Run(x =>
    {
    x.UseLog4Net("log4net.config");

    x.Service<SampleService>();
    x.SetDescription("TopshelfSample说明");
    x.SetDisplayName("TopshelfSample显示名称");
    x.SetServiceName("TopshelfSample服务名称");
    });
    }

    这样一个简单的服务就完成了。

    log4net.config 如下:


    <?xml version="1.0" encoding="utf-8" ?>
    <log4net>
    <appender name="RollingFile"
    type="log4net.Appender.FileAppender">
    <file value="service.log" />
    <appendToFile value="true" />
    <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
    <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%-5p %d{hh:mm:ss} %message%newline" />
    </layout>
    </appender>

    <appender name="ColoredConsoleAppender"
    type="log4net.Appender.ColoredConsoleAppender">
    <mapping>
    <level value="ERROR" />
    <foreColor value="Red, HighIntensity" />
    </mapping>
    <mapping>
    <level value="INFO" />
    <foreColor value="White" />
    </mapping>
    <mapping>
    <level value="DEBUG" />
    <foreColor value="Cyan" />
    </mapping>
    <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%message%newline" />
    </layout>
    </appender>

    <!-- Set root logger level to DEBUG and its only appender to Console -->
    <root>
    <level value="DEBUG" />
    <appender-ref ref="RollingFile" />
    <appender-ref ref="ColoredConsoleAppender" />
    </root>
    </log4net>

    安装服务
    服务编写好以后,我们可以直接安装,安装的命令也很简单,直接 TopshelfSample.exe install

    已经成功安装。

    启动:TopshelfSample.exe start

    停止:TopshelfSample.exe stop

    卸载:TopshelfSample.exe uninstall

    更多命令可以TopshelfSample.exe help

    跨平台
    Topshelf是一个开源的跨平台的宿主服务框架,不过本身只支持mono 命令行执行,不能使用Topshelf的命令行Start,Stop控制服务。

    log4net ColoredConsoleAppender 不支持linux ,所以去掉ColoredConsoleAppender ,保留RollingFile。

    log4net.config


    <?xml version="1.0" encoding="utf-8" ?>
    <log4net>
    <appender name="RollingFile"
    type="log4net.Appender.FileAppender">
    <file value="service.log" />
    <appendToFile value="true" />
    <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
    <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%-5p %d{hh:mm:ss} %message%newline" />
    </layout>
    </appender>
    <!-- Set root logger level to DEBUG and its only appender to Console -->
    <root>
    <level value="DEBUG" />
    <appender-ref ref="RollingFile" />
    </root>
    </log4net>

    下面我们就来看看一下运行在linux下。

    首先大家要安装好 mono

    可以参考:http://www.cnblogs.com/linezero/p/4774850.html

    测试系统版本:centos 6.4  mono 3.10.0

    将程序上传到linux 系统执行。 

    mono TopshelfSample.exe

     查看日志,成功执行

    参考文档:

    https://topshelf.readthedocs.org/en/latest/configuration/quickstart.html

  • 相关阅读:
    初识云计算:历史、服务、架构
    云计算术语扫盲
    什么是 VxLAN?
    Linux用户态与内核态通信的几种方式
    Linux 命令多到记不住?这个开源项目帮你一网打尽!
    云计算时代,数据中心架构三层到大二层的演变
    Linux网络命令必知必会之瑞士军刀 nc(netcat)
    Docker 网络模型之 macvlan 详解,图解,实验完整
    基于alpine构建镜像报错temporary error (try again later)?
    win7环境下,vagrant,在启动虚拟机的时候报错io.rb:32:in `encode': incomplete "xC8" on GBK (Encoding::InvalidByteSequenceError)
  • 原文地址:https://www.cnblogs.com/micro-chen/p/5885927.html
Copyright © 2020-2023  润新知