C# 创建Windows服务,bat脚本服务注册启动删除

news2024/12/24 18:43:43

1、创建Windows服务,如下图。.NET Framework 4。Visual Studio 2019 。

2、在项目文件夹下创建文件夹LogConfig用于配置log4net,在LogConfig文件夹下新建log4net.config文件,如下图。

 log4net.config文件内容如下。

<?xml version="1.0" encoding="utf-8"?><configuration>
	<configSections>
		<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
	</configSections>
	<system.web>
		<compilation debug="true" targetFramework="4.0.0" />
		<httpRuntime targetFramework="4.0.0" />
	</system.web>
	<log4net>
		<!--错误日志:::记录错误日志-->
		<!--按日期分割日志文件 一天一个-->
		<!-- appender 定义日志输出方式 将日志以回滚文件的形式写到文件中。-->
		<appender name="ErrorAppender" type="log4net.Appender.RollingFileAppender">
			<!--保存路径:下面路径项目启动的时候自动在C盘中创建log、logError文件-->
			<file value="log/error/error_" />
			<!-- 如果想在本项目中添加路径,那就直接去掉C:\\ 只设置log\\LogError 项目启动中默认创建文件 -->
			<appendToFile value="true"/>
			<!--按照何种方式产生多个日志文件(日期[Date],文件大小[Size],混合[Composite])-->
			<rollingStyle value="Date"/>
			<!--这是按日期产生文件夹-->
			<datePattern value="yyyy-MM-dd'.log'"/>
			<!--是否只写到一个文件中-->
			<staticLogFileName value="false"/>
			<!--保留的log文件数量 超过此数量后 自动删除之前的 好像只有在 按Size分割时有效 设定值value="-1"为不限文件数-->
			<param name="MaxSizeRollBackups" value="100"/>
			<!--每个文件的大小。只在混合方式与文件大小方式下使用。超出大小后在所有文件名后自动增加正整数重新命名,数字最大的最早写入。可用的单位:KB|MB|GB。不要使用小数,否则会一直写入当前日志-->
			<maximumFileSize value="50MB" />
			<!-- layout 控制Appender的输出格式,也可以是xml 一个Appender只能是一个layout-->
			<layout type="log4net.Layout.PatternLayout">
				<!--每条日志末尾的文字说明-->
				<!--输出格式 模板-->
				<!-- <param name="ConversionPattern" value="记录时间:%date 线程ID:[%thread] 日志级别:%-5level 记录类:%logger 操作者ID:%property{Operator} 操作类型:%property{Action}%n 当前机器名:%property%n当前机器名及登录用户:%username %n 记录位置:%location%n 消息描述:%property{Message}%n 异常:%exception%n 消息:%message%newline%n%n" />-->
				<!--样例:2008-03-26 13:42:32,111 [10] INFO Log4NetDemo.MainClass [(null)] - info-->
				<!--<conversionPattern value="%newline %n记录时间:%date %n线程ID:[%thread] %n日志级别:%-5level %n错误描述:%message%newline %n"/>-->
				<conversionPattern value="%n========== %n【日志级别】%-5level %n【记录时间】%date %n【执行时间】[%r]毫秒 %n【出错文件】%F %n【出错行号】%L %n【出错的类】%logger 属性[%property{NDC}] %n【错误描述】%message %n【错误详情】%newline"/>
			</layout>
			<filter type="log4net.Filter.LevelRangeFilter,log4net">
				<levelMin value="ERROR" />
				<levelMax value="FATAL" />
			</filter>
		</appender>
		<!--DEBUG:::记录DEBUG日志-->
		<!--按日期分割日志文件 一天一个-->
		<!-- appender 定义日志输出方式 将日志以回滚文件的形式写到文件中。-->
		<appender name="DebugAppender" type="log4net.Appender.RollingFileAppender">
			<!--保存路径:下面路径项目启动的时候自动在C盘中创建log、logError文件-->
			<file value="log/debug/debug_" />
			<!-- 如果想在本项目中添加路径,那就直接去掉C:\\ 只设置log\\LogError 项目启动中默认创建文件 -->
			<appendToFile value="true"/>
			<!--按照何种方式产生多个日志文件(日期[Date],文件大小[Size],混合[Composite])-->
			<rollingStyle value="Date"/>
			<!--这是按日期产生文件夹-->
			<datePattern value="yyyy-MM-dd'.log'"/>
			<!--是否只写到一个文件中-->
			<staticLogFileName value="false"/>
			<!--保留的log文件数量 超过此数量后 自动删除之前的 好像只有在 按Size分割时有效 设定值value="-1"为不限文件数-->
			<param name="MaxSizeRollBackups" value="100"/>
			<!--每个文件的大小。只在混合方式与文件大小方式下使用。超出大小后在所有文件名后自动增加正整数重新命名,数字最大的最早写入。可用的单位:KB|MB|GB。不要使用小数,否则会一直写入当前日志-->
			<maximumFileSize value="50MB" />
			<!-- layout 控制Appender的输出格式,也可以是xml 一个Appender只能是一个layout-->
			<layout type="log4net.Layout.PatternLayout">
				<!--每条日志末尾的文字说明-->
				<!--输出格式 模板-->
				<!-- <param name="ConversionPattern" value="记录时间:%date 线程ID:[%thread] 日志级别:%-5level 记录类:%logger 操作者ID:%property{Operator} 操作类型:%property{Action}%n 当前机器名:%property%n当前机器名及登录用户:%username %n 记录位置:%location%n 消息描述:%property{Message}%n 异常:%exception%n 消息:%message%newline%n%n" />-->
				<!--样例:2008-03-26 13:42:32,111 [10] INFO Log4NetDemo.MainClass [(null)] - info-->
				<!--<conversionPattern value="%newline %n记录时间:%date %n线程ID:[%thread] %n日志级别:%-5level %n错误描述:%message%newline %n"/>-->
				<conversionPattern value="%n========== %n【日志级别】%-2level %n【记录时间】%date %n【执行时间】[%r]毫秒 %n【debug文件】%F %n【debug行号】%L %n【debug类】%logger 属性[%property{NDC}] %n【debug描述】%message"/>
			</layout>
			<filter type="log4net.Filter.LevelRangeFilter,log4net">
				<levelMin value="DEBUG" />
				<levelMax value="WARN" />
			</filter>
		</appender>
		<!--INFO:::记录INFO日志-->
		<!--按日期分割日志文件 一天一个-->
		<!-- appender 定义日志输出方式 将日志以回滚文件的形式写到文件中。-->
		<appender name="INFOAppender" type="log4net.Appender.RollingFileAppender">
			<!--保存路径:下面路径项目启动的时候自动在C盘中创建log、logError文件-->
			<file value="log/info/info_" />
			<!-- 如果想在本项目中添加路径,那就直接去掉C:\\ 只设置log\\LogError 项目启动中默认创建文件 -->
			<appendToFile value="true"/>
			<!--按照何种方式产生多个日志文件(日期[Date],文件大小[Size],混合[Composite])-->
			<rollingStyle value="Date"/>
			<!--这是按日期产生文件夹-->
			<datePattern value="yyyy-MM-dd'.log'"/>
			<!--是否只写到一个文件中-->
			<staticLogFileName value="false"/>
			<!--保留的log文件数量 超过此数量后 自动删除之前的 好像只有在 按Size分割时有效 设定值value="-1"为不限文件数-->
			<param name="MaxSizeRollBackups" value="100"/>
			<!--每个文件的大小。只在混合方式与文件大小方式下使用。超出大小后在所有文件名后自动增加正整数重新命名,数字最大的最早写入。可用的单位:KB|MB|GB。不要使用小数,否则会一直写入当前日志-->
			<maximumFileSize value="50MB" />
			<!-- layout 控制Appender的输出格式,也可以是xml 一个Appender只能是一个layout-->
			<layout type="log4net.Layout.PatternLayout">
				<!--每条日志末尾的文字说明-->
				<!--输出格式 模板-->
				<!-- <param name="ConversionPattern" value="记录时间:%date 线程ID:[%thread] 日志级别:%-5level 记录类:%logger 操作者ID:%property{Operator} 操作类型:%property{Action}%n 当前机器名:%property%n当前机器名及登录用户:%username %n 记录位置:%location%n 消息描述:%property{Message}%n 异常:%exception%n 消息:%message%newline%n%n" />-->
				<!--样例:2008-03-26 13:42:32,111 [10] INFO Log4NetDemo.MainClass [(null)] - info-->
				<!--<conversionPattern value="%newline %n记录时间:%date %n线程ID:[%thread] %n日志级别:%-5level %n错误描述:%message%newline %n"/>-->
				<conversionPattern value="%n========== %n【日志级别】%-2level %n【记录时间】%date %n【执行时间】[%r]毫秒 %n【info文件】%F %n【info行号】%L %n【info类】%logger 属性[%property{NDC}] %n【info描述】%message"/>
			</layout>
			<filter type="log4net.Filter.LevelRangeFilter,log4net">
				<levelMin value="INFO" />
				<levelMax value="WARN" />
			</filter>
		</appender>
		<!--Set root logger level to DEBUG and its only appender to A1-->
		<root>
			<!--控制级别,由低到高: ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF-->
			<level value="ALL" />
			<appender-ref ref="DebugAppender" />
			<appender-ref ref="ErrorAppender" />
			<appender-ref ref="INFOAppender" />
		</root>
	</log4net>
</configuration>

3、通过Nuget添加对log4net的引用,如下图。

4、 在AssemblyInfo.cs文件中添加如下代码。

[assembly: log4net.Config.XmlConfigurator(ConfigFileExtension = "config", ConfigFile = "LogConfig/log4net.config", Watch = true)]

5、WindowsServiceMonitor.cs代码内容如下,当Windows服务启动和停止的时候都会记录。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;

namespace WindowsServiceMonitor
{
    public partial class WindowsServiceMonitor : ServiceBase
    {
        private static readonly log4net.ILog logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
        public WindowsServiceMonitor()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
            logger.Info("Winodws服务启动了");
        }

        protected override void OnStop()
        {
            logger.Info("Winodws服务停止了");
        }
    }
}

6、双击WindowsServiceMonitor.cs文件,进入WindowsServiceMonitor.cs[设计]界面,在属性处点击“添加安装程序”,如下图。

7、这时ProjectInstaller.cs文件被添加,剪辑ProjectInstaller.cs文件,分别设置文件中的两个控件(暂时这么叫吧) ,分别设置如下图。

8、 在生成的程序所在目录下添加两个bat脚本,分别是注册服务和删除服务。代码如下。

@echo off
set MY_PATH="%~dp0WindowsServiceMonitor.exe"
echo %MY_PATH%
sc create WindowsServiceMonitor binPath= %MY_PATH% DisplayName= "WindowsServiceMonitor"
sc config WindowsServiceMonitor start= auto
net start "WindowsServiceMonitor"
pause
@echo off
net stop "WindowsServiceMonitor"
sc delete WindowsServiceMonitor
pause

生产环境时刻将 pause 去掉。

9、Windows服务的调试,使用附加到进程中进行调试。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2202810.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

能自动铲屎的自动猫砂盆是智商税吗?双十一热门自动猫砂盆推荐

大家平时一天要给猫咪铲几次屎呢&#xff1f;大多数应该都是早中晚各一次吧&#xff0c;在家的时候尚且能办到&#xff0c;但是一到了上班、出差、旅游的日子&#xff0c;我们又要如何保证猫咪的猫砂盆得到及时的清洁呢&#xff1f;要知道小猫咪的屎也很臭&#xff0c;猫砂盆长…

Linux云计算 |【第四阶段】RDBMS2-DAY4

主要内容&#xff1a; MHA概述、部署MHA集群 一、MHA概述 1、MHA简介 MHA&#xff08;Master High Availability&#xff09;是一款开源的MySQL的高可用程序&#xff0c;由日本DeNA公司youshimaton开发&#xff0c;是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的…

Vue组件继承与扩展

Vue组件继承与扩展 前言 与Class继承类似&#xff0c;在Vue中可以通过组件继承来达到复用和扩展基础组件的目的&#xff0c;虽然它可能会带来一些额外的性能损耗和维护成本&#xff0c;但其在解决一些非常规问题时有奇效。本文将通过一些非常规的功能需求来讨论其实现过程。 …

广州自闭症寄宿学校有哪些?选择最适合孩子的学校

在广州这座繁华而充满人文关怀的城市里&#xff0c;有一群特殊的孩子&#xff0c;他们被称为“星星的孩子”——自闭症儿童。他们生活在自己的世界里&#xff0c;对外界的刺激反应迟钝或过度敏感&#xff0c;社交互动困难&#xff0c;语言表达受限。然而&#xff0c;在广州&…

高中数学基础

1.1函数的定义与性质 01函数定义 D是一个非&#xff0c;空时数集&#xff0c;对于D中的每一个X都有一个对应的规则f&#xff0c;能相应只对应唯一的一个实数Y&#xff0c;那么可以称Yf(X)&#xff0c;是一个函数。 判断是否为同一个函数&#xff0c;需要满足两个条件&#xff…

基于springboot和vue.js 养老院管理系统设计与实现

博主介绍&#xff1a;专注于Java&#xff08;springboot ssm springcloud等开发框架&#xff09; vue .net php phython node.js uniapp小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设&#xff0c;从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆…

LLM-RAG相关常见面试题

#############【持续更新】############## LLM-RAG相关常见面试题 1. RAG技术体系的总体思路 RAG可分为5个基本流程&#xff1a;知识文档的准备&#xff1b;嵌入模型&#xff08;embedding model&#xff09;&#xff1b;向量数据库&#xff1b;查询检索和生产回答。 参考&a…

山西省中小学生学籍照片手机拍照集中采集指南

随着山西省教育信息化的持续发展&#xff0c;学校管理的数字化转型中&#xff0c;学籍信息的精确记录变得尤为关键。在这一背景下&#xff0c;学籍管理系统的优化升级显得尤为重要。为了保障学生资料的精确无误&#xff0c;山西省对中小学生学籍系统中的照片采集和上传流程提出…

5本一投就中的极速期刊,性价比高,1周-1个月录用,见刊极快!

在当今快节奏的学术界&#xff0c;研究者们不仅追求高质量的研究成果&#xff0c;还希望能够迅速地将这些成果分享给全球的同行。为此&#xff0c;科检易学术精心挑选了10本以高效审稿流程著称的期刊&#xff0c;这些期刊不仅性价比高&#xff0c;而且从投稿到录用的时间极短&a…

使用API有效率地管理Dynadot域名,设置域名服务器(NS)的ip信息

前言 Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮箱&…

决策树(descision tree)

一&#xff1a;决策树的基础介绍 决策树(descision tree)是一种基本的分类与回归的方法。决策树是一种对实例进行预测的树型结构。 下面是一个完整的二叉决策树&#xff0c;根据西瓜的几个特征判断西瓜的好坏。 纹理<1.5代表第一个判断条件&#xff0c;根据纹理<1.5是…

【JDK17 | 16】Java 17 深入剖析:密封类(二)

一、密封类的使用场景和优势 什么是密封类&#xff1f; 密封类&#xff08;sealed class&#xff09;是 Java 17 引入的一种新特性&#xff0c;允许开发者控制哪些类可以继承或实现某个类或接口。通过使用密封类&#xff0c;开发者可以定义一组特定的子类&#xff0c;从而提供…

【springboot9733】基于springboot+vue的藏区特产销售平台

作者主页&#xff1a;Java码库 主营内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 项目描述 “互联网”的战略实施后&#xff0c;很多行业的信息化水…

好用的AI工具

目录 1.常用AI工具 1.1.语音助手 1.1.1. 华为小艺 1.1.2. 小米小爱同学 1.2.智能客服 1.2.1. 银行客服 1.2.2. 酒店语音电话 1.3.编程助手 1.3.1. 百度Comate 1.3.2. 华为CodeArts 2.创新AI应用 2.1. 生成式AI 2.2. 自动驾驶技术 2.3. 医疗AI 2.4. 智能客服机器…

简单的maven nexus私服学习

简单的maven nexus私服学习 1.需求 我们现在使用的maven私服是之前同事搭建的&#xff0c;是在公司的一台windows电脑上面&#xff0c;如果出问题会比较难搞&#xff0c;所以现在想将私服迁移到我们公司的测试服务器上&#xff0c;此处简单了解一下私服的一些配置记录一下&am…

conda新建环境中存在大量ros相关python包

1 问题现象 新建的conda环境&#xff0c;执行pip list&#xff0c;出现了大量的ros相关包&#xff0c;环境不纯净。重新安装anaconda没有用。 2 问题原因 2.1 执行python -m site 执行python -m site获得以下结果 其中sys.path包含了’/opt/ros/noetic/lib/python3/dist-…

想要项目顺利进行,企业如何做好节点计划管理?

项目的成功实施对于企业的发展和竞争力提升至关重要。然而&#xff0c;要确保项目顺利进行并非易事&#xff0c;其中做好节点计划管理是关键所在。一个精心策划和有效执行的节点计划&#xff0c;能够为项目的推进提供清晰的路线图&#xff0c;帮助企业合理分配资源、控制进度、…

VR虚拟场景:重塑沉浸式购物体验的新篇章

在科技日新月异的今天&#xff0c;虚拟现实&#xff08;VR&#xff09;技术正以前所未有的速度改变着我们的生活方式&#xff0c;特别是在消费领域&#xff0c;它正引领着一场前所未有的购物体验革命。通过构建高度逼真的虚拟场景&#xff0c;VR技术为消费者打造了一个超越现实…

修改 antd a-popover气泡卡片弹窗背景颜色

antdv 中 a-popover 样式修改不生效的问题 因为 popover 元素添加到了 body 下面&#xff0c;增加下面这几行代码&#xff0c;将 popover 添加到它原本的父级下面&#xff0c;然后用 ::v-deep 去修改样式就可以 1.效果图 2.代码 主要的代码就是 :getPopupContainer"(tri…

【笔记】Day2.4表设计说明

主键ID一般使用bigint类型 运送类型 使用比int更小的tinyint类型 eg&#xff1a;普快代表1 特快代表2&#xff08;没写反&#xff09; 关联城市 varchar 2代表京津冀 3代表江浙沪 4代表川渝 首重和续重都有小数点 故使用double 轻抛系数都为整数 故使用int 创建时间和修改…