当前位置: 首页 > article >正文

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

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.kler.cn/news/336356.html

相关文章:

  • Spring Boot 进阶-详解Spring Boot与其他框架整合
  • Ambari搭建Hadoop集群 — — 问题总结
  • 阿里巴巴_java开发规范手册详解
  • 自然语言处理:第五十一章 LangChain面经
  • 如何使用Redisson的布隆过滤器?
  • 初入网络学习第一篇
  • 【自用】王道文件管理强化笔记
  • Qt界面编程03
  • 【React】入门Day03 —— Redux 与 React Router 核心概念及应用实例详解
  • C# 泛型编程基础:自定义泛型类、方法与接口的应用
  • 基于场景的营销:开源AI智能名片S2B2C商城小程序的机遇与挑战
  • 推理攻击-Python案例
  • C++ Linux多进程同步-命名信号量
  • Docker系列-5种方案超详细讲解docker数据存储持久化(volume,bind mounts,NFS等)
  • Hive数仓操作(十六)
  • Flutter---适配高版本studio运行里面的Android项目报错
  • 网络层常用互联网协议
  • (15)衰落信道模型作用于信号是相乘还是卷积
  • Electron桌面应用打包现有的vue项目
  • 如何使用ssm实现基于Java的校园二手物品交易平台的设计与实现+vue