使用.netcore部署window服務完成過程(使用nssm,Topshelf)


 

一,新建.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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM