.NetCore8 windows 系统后台服务 workserver

workserver是一种专门用来运行耗时服务所提供的一种项目模板,后台服务

一、创建

VS Install必须支持ASP.Net和Web开发

 

 

完成后,安装nuget包 (一个是windows的系统服务,一个是linux的系统服务)

Install-Package Microsoft.Extensions.Hosting.WindowsServices
Install-Package Microsoft.Extensions.Hosting.Systemd

二、代码如下

Program.cs

using Microsoft.AspNetCore.Builder;
using NLog.Web;
using SimpleMQTT;
using WLAdmin.Background;


var builder = WebApplication.CreateBuilder(args);
builder.Host.UseWindowsService();// 使用Windows服务托管
builder.Host.UseSystemd();//来配置服务以在 Linux 上作为 systemd 服务运行
builder.Host.UseNLog(); // 使用NLog为Microsoft.Extensions.Logging的日志记录,默认根目录下NLog.config

builder.Services.AddSingleton<IMqttClientManager, MqttClientManager>();// 添加MQTT客户端管理器
builder.Services.AddHostedService<Worker>();// 添加后台服务
var app = builder.Build();
app.Run();

 

Worker.cs

public class Worker : BackgroundService
{
    private readonly ILogger<Worker> _logger;
    private readonly MqttClient _mqtt;

    public Worker(ILogger<Worker> logger, IMqttClientManager mqttClientManager)
    {
        _logger = logger;
        this._mqtt = mqttClientManager.GetClient();
    }

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        //订阅库位主题
        await _mqtt.SubscribeAsync("FMS/WmStoragePosition/#", (e) =>
        {
            var msg = e.Payload.ToStr();
            var topicList = e.Topic.Split("/");//根据/分割
            var clientId = topicList[topicList.Length - 1];//获取客户端ID
            _logger.LogInformation($"库位{clientId},状态{msg}");
        });

        //订阅储位主题
        await _mqtt.SubscribeAsync("FMS/FmsWhPosition/#", (e) =>
        {
            var msg = e.Payload.ToStr();
            var topicList = e.Topic.Split("/");//根据/分割
            var clientId = topicList[topicList.Length - 1];//获取客户端ID
            _logger.LogInformation($"储位{clientId},状态{msg}");
        });
    }
}

三、增加4个bat脚本,属性:如果较新则复制

1、安装服务.bat

@echo off
color 0e
@echo ==================================
@echo 提醒:请右键本文件,用管理员方式打开。
@echo ==================================
@echo Start Install WLAdmin.Background

cd ..
sc create WLAdmin.Background binPath=%~dp0WLAdmin.Background.exe start= auto 
sc description WLAdmin.Background "WLAdmin后台服务"
Net Start WLAdmin.Background
pause

2、启动服务

@echo off
color 0e
@echo ==================================
@echo  提醒:请右键本文件,用管理员方式打开。
@echo ==================================
@echo Start Start WLAdmin.Background

Net Start WLAdmin.Background
pause

3、停止服务

@echo off
color 0e
@echo ==================================
@echo  提醒:请右键本文件,用管理员方式打开。
@echo ==================================
@echo Start Stop WLAdmin.Background

Net stop WLAdmin.Background
pause

4、卸载服务

@echo off
color 0e
@echo ==================================
@echo 提醒:请右键本文件,用管理员方式打开。
@echo ==================================
@echo Start Remove WLAdmin.Background

Net stop WLAdmin.Background
sc delete WLAdmin.Background
pause

运行安装、启动服务就会添加到windows服务里面

 

四、日志保存到文件夹

 1、NLog支持

  安装依赖 NLog.Web.AspNetCore

 Nlog.config配置文件

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
      autoReload="true"
      throwExceptions="false"
      internalLogLevel="Warn"
      internalLogFile="Logs/nlog-internal.log">
    <variable name="myvar" value="myvalue"/>
    <targets>

        <!-- write logs to file -->
        <target xsi:type="File" name="allfile" fileName="Logs/${date:format=yyyyMM}/nlog-all-${shortdate}.log"
                 layout="${longdate}|${event-properties:item=EventId.Id}|${uppercase:${level}}|${logger} ${newline}${message} ${exception} ${newline}" />

        <target xsi:type="File" name="ownFile-web" fileName="Logs/${date:format=yyyyMM}/nlog-own-${shortdate}.log"
                 layout="${longdate}|${event-properties:item=EventId.Id}|${uppercase:${level}}|${logger} ${newline}${message} ${exception} ${newline}" />
        <!--  |url: ${aspnet-request-url}|action: ${aspnet-mvc-action}" -->
        <target xsi:type="Null" name="blackhole" />
    </targets>

    <rules>

        <!--All logs, including from Microsoft-->
        <!--minlevel 改为Trace 跟踪全部 Error 只捕获异常-->
        <logger name="*" minlevel="Error" writeTo="allfile" />

        <!--Skip Microsoft logs and so log only own logs-->
        <logger name="Microsoft.*" minlevel="Trace" writeTo="blackhole" final="true" />
        <logger name="*" minlevel="Trace" writeTo="ownFile-web" />

    </rules>
</nlog>

启用Nlog 

builder.Host.UseNLog(); // 使用NLog为Microsoft.Extensions.Logging的日志记录,默认根目录下NLog.config

 使用

_logger.LogInformation($"储位{clientId},状态{msg}");

 

2、自己记录

        //手动添加日志
        private void Log(string data)
        {
            //Environment.CurrentDirectory = AppDomain.CurrentDomain.BaseDirectory;
            using (StreamWriter sw = new StreamWriter($"{AppDomain.CurrentDomain.BaseDirectory}/Logs/{DateTime.Now.ToString("yyyy-MM-dd")}.txt", true))
            {
                sw.WriteLine(data);
            }
        }

使用

Log($"Worker running at: {DateTime.Now}:储位{clientId},状态{msg}");

 

posted on 2025-03-10 14:30  张彦山  阅读(257)  评论(0)    收藏  举报