如何为Windows服务增加日志的功能。

一、简介

    最近在做一个项目的时候,需要该项目自动启动、自动运行,不需要认为干预。不用说,大家都知道用什么技术,那就是 Windows服务。在以前的Net Framework 平台下,Windows 服务是一个不错的选择。如果现在在Net Core版本,或者Net5.0以及以上版本,我们会有另外一个选择,这就是 Worker Service,中文叫:辅助角色服务。它使用起来,维护起来更方便。话好像有点跑题了。我们言归正传,当我们做了一个Windows服务的进程来承载程序,还有另外一个工作需要做。那就是需要让我们的服务程序告诉我们,程序是否运行正常,干了什么,没有干什么,执行了哪些步骤,说道这些,就是我们所说的,要给Windows服务增加日志功能。

    为了给Windows服务增加日志功能,我们今天选择了两个日志组件,第一:EventLog,第二:Log4net。

    开发环境:

        开发工具:Visual Studio 2019

        开发语言:C#

 

二、具体操作

    1、为项目增加 EventLog 功能

        1.1、创建 Windows 服务项目。

            我们打开 Visual Studio 2019,在首页上选择“创建新项目”

            

            点击《创建新项目》,进入《创建新项目》窗体,可以在左侧选择使用过的模板,也可以在右侧选择我们需要的模板。

            

            点击《下一步》,进入《配置新项目》窗口,输入项目名称,解决方案名称和项目的保存路径地址。

            

            点击《创建》,开始创建项目和解决方案。

            

        1.2、修改Service1.cs文件名称为《MyWindowsService.cs》,并在服务的设计窗口中添加工具EventLog,在《工具栏》中打开组件《EventLog》,并将其拖到我们服务之上。

            

        1.3、然后在我们服务的构造函数中增加一下代码。            

              

 1 using System;
 2 using System.Diagnostics;
 3 using System.IO;
 4 using System.ServiceProcess;
 5 using System.Timers;
 6 
 7 namespace PatrickLiu.WindowsService.RfcPlatform
 8 {
 9     /// <summary>
10     /// 我们定义的 Windows 服务。
11     /// </summary>
12     public partial class MyWindowsService : ServiceBase
13     {
14         private int eventId = 1;
15 
16         /// <summary>
17         /// 服务的构造函数
18         /// </summary>
19         public MyWindowsService()
20         {
21             //记录到event log中,地址是 C:\Windows\System32\winevt\Logs (双击查看即可,文件名为MyNewLog)
22             InitializeComponent();
23             if (!System.Diagnostics.EventLog.SourceExists("PatrickLiuEventSource"))
24             {
25                 System.Diagnostics.EventLog.CreateEventSource("PatrickLiuEventSource", "PatrickLog");
26             }
27             MyEventLog.Source = "PatrickLiuEventSource";
28             MyEventLog.Log = "PatrickLog";            
29         }
30 
31         /// <summary>
32         /// 服务开始启动。
33         /// </summary>
34         /// <param name="args"></param>
35         protected override void OnStart(string[] args)
36         {
37             MyEventLog.WriteEntry("开启服务。");
38             Log("In OnStart.");
39 
40             #region 可以定义个人的服务
41 
42             Timer timer = new Timer();
43             timer.Interval = 60000; // 60 seconds 60秒执行一次
44             timer.Elapsed += new ElapsedEventHandler(OnTimer);
45             timer.Start();
46 
47             #endregion
48         }
49 
50         /// <summary>
51         /// 服务开始关闭
52         /// </summary>
53         protected override void OnStop()
54         {
55             MyEventLog.WriteEntry("关闭服务。");
56 
57             #region 可以定义要结束服务要做的事情。
58 
59             Log("In OnStop.");
60 
61             #endregion
62         }
63 
64         /// <summary>
65         /// 继续服务
66         /// </summary>
67         protected override void OnContinue()
68         {
69             MyEventLog.WriteEntry("In OnContinue.");
70             Log("In OnContinue.");
71         }
72 
73         /// <summary>
74         /// 定时器中定时执行的任务
75         /// </summary>
76         /// <param name="sender"></param>
77         /// <param name="args"></param>
78         public void OnTimer(object sender, ElapsedEventArgs args)
79         {
80             // TODO: Insert monitoring activities here.
81             MyEventLog.WriteEntry("我开始运行了!", EventLogEntryType.Information, eventId++);
82             Log("the timer");
83         }
84 
85         /// <summary>
86         /// 记录到指定路径:D:\log.txt
87         /// </summary>
88         /// <param name="message"></param>
89         private static void Log(string message)
90         {
91             using (FileStream stream = new FileStream("D:\\log.txt", FileMode.Append))
92             using (StreamWriter writer = new StreamWriter(stream))
93             {
94                 writer.WriteLine($"{DateTime.Now}:{message}");
95             }
96         }
97     }
98 }

View Code

 

        1.4、右键点击我们的服务,添加安装程序。

            

            

            项目目录结构如下:

            

 

        1.5、修改安装程序 serviceInstaller1 名称为:MyServiceInstaller,右键,修改serviceName和Description。

            

 

        1.6、在 serviceProcessInstaller 上修改名称,右键,修改 Account 为 LocalSystem。

            

 

        1.7、如果运行 InstallUtil命令,提示不是有效命令,要执行以下操作。跟着操作就可以。

 

        1.8、将【C:\Windows\Microsoft.NET\Framework64\v4.0.30319】这个项目文件的地址增加到环境变量中;如图

             拷贝地址:C:\Windows\Microsoft.NET\Framework64\v4.0.30319
            

            在我的电脑图标上右键点击《属性》,打开《系统》窗口,点击左侧《高级系统设置》,进入设置窗口。

            

            打开《环境变量》窗口,选择《系统变量》,它可以作用域所有用户。在《系统变量》窗口,查找《Path》,然后选择编辑,把我们拷贝的目录,复制到值最后,通过英文分号分割。

            

            确定关闭所有窗口,然后打开cmd窗口,输入:installuils,看看怎么样?和以下一样就说明你可以继续了。

            

            切记:安装服务的时候,必须以管理员的身份运行。否则会有你意想不到错误。

        1.9、编译解决方案和项目,开始安装服务,首先我们以管理员身份运行cmd。

            进入到项目的目录,执行 Installutil PatrickLiu.WindowsService.RfcPlatform.exe

            

 

        2.0、打开服务管理器,启动MyService服务,并且等待几分钟,然后卸载服务

           

        2.1、检验是否有效果

            

 

 

              好了,这一篇就到这里了。

    2、为项目增加Log4net 功能。

      2.1、项目和上面的项目是同一个,我们在该目录下增加文件夹,名称为:LogConfig,在该文件夹下增加配置文件,名称:log4net.config

          

 

          log4.net.config 内容:          

 1 <?xml version="1.0" encoding="utf-8" ?>
 2 <log4net>
 3   <appender name="DebugAppender" type="log4net.Appender.DebugAppender" >
 4     <layout type="log4net.Layout.PatternLayout">
 5       <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
 6     </layout>
 7   </appender>
 8   <!--指定日记记录方式,以滚动文件的方式(文件记录)-->
 9   <appender name="RollingFile" type="log4net.Appender.RollingFileAppender">
10     <!--日志路径-->
11     <file value="LogFiles\log-" />
12     <!--是否是向文件中追加日志-->
13     <appendToFile value="true" />
14     <!--log保留天数-->
15     <param name= "MaxSizeRollBackups" value= "10"/>
16     <!--每个文件最大1M-->
17     <param name="maximumFileSize" value="1MB" />
18     <!--日志根据日期滚动-->
19     <param name="RollingStyle" value="Date" />
20     <!--日志文件名格式为:logs_20080831.log-->
21     <param name="DatePattern" value="yyyyMMdd&quot;.log&quot;"/>
22     <!--日志文件名是否是固定不变的-->
23     <param name="StaticLogFileName" value="false" />
24     <!--布局-->
25     <layout type="log4net.Layout.PatternLayout">
26       <conversionPattern value="%date %5level %logger.%method [%line] - MESSAGE: %message%newline %exception" />
27     </layout>
28   </appender>
29   <root>
30     <level value="ALL"/>
31     <appender-ref ref="DebugAppender" />
32     <appender-ref ref="RollingFile" />
33   </root>
34 </log4net>

 

            并且该文件的属性设置为:复制到输出目录-》始终复制。

 

          

 

 

      2.2、第二步,我们要安装 Log4net的组件,通过nuget来安装。

           在项目的《引用》上点击右键,选择《管理 NuGet 程序包》

            

              然后,点击《浏览》,在文本框中输入要查找组件的名称,在右侧选择安装。

              

 

          2.3、配置 AssemblyInfo.cs 文件。              

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

              截图如下:
                                                

                 

      2.4、在我们Windows服务获取Log4net 的实例。          

              private static readonly log4net.ILog logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

 

              

 

 

      2.3、完成之后,我们安装 Windows服务,然后在项目的运行目录里查看,确认日志是否启用。

          我们要在此安装服务,先要卸载服务。

            执行以下命令:先是切换目录,然后执行命令:installutil /u PatrickLiu.WindowsService.RfcPlatform.exe

          

           然后,我们再次执行命令:installutil PatrickLiu.WindowsService.RfcPlatform.exe 重新安装服务。

           

 

 

      2.4、Windows服务的安装过程和上面都是一样,所以这里就不重复了。

        2.5、确认log4net是否启作用。 

          

            打开LogFIles目录,我们看到了日志文件。

            

 

 

三、总结

    好了,今天就写到这里了。俗话说的好,好记性不如烂笔头,所以我就记录下来,以防自己需要的时候查找使用。而且每步都是自己试验过的。可以放心使用。不忘初心,继续努力,老天不会辜负努力人的。

天下国家,可均也;爵禄,可辞也;白刃,可蹈也;中庸不可能也

推荐这些文章:

MySQL: = := @ @@ <=>

 
 
 
 
 
 
 
 
 
 
 
 
 

...

正则表达式(?<=<(\w+)>).*(?=<\/\1>) 分组

问题
正则表达式(?<=<(\w+)>).*(?=<\/\1>)里面\1代表的是 (\w+) 还是 (?<=<(\w+)>)     ?请解释一下,谢谢!

最佳回答
测试了下   是指 (\w+)

...

关于log4net自定义log文件名的问题.

问题
我想在项目中用log4net生成自定义的文件名,如,20100902.log.
我想这个在web.config里是做不了的.
就用程序配.可使老是报
 
警告 1“log4net.Appender.FileAppender.FileAppender(log4net.Layout.ILayout, string)”已过时:“Instead use the default constructor and set the Layout & File properties”E:\Conpa...

filebeat系列-如何给日志增加一些额外的标记字段

1、 filebeat如何对日志增加id?
使用processor的add_id或fingerprint
2、 如何增加自定义的一些属性?
通过general options中的name,tags,fields
或namespace里的tags,fields,建议使用fields_under_root将属性解析为根属性
或processor的add_field
- add_fields:
      myFields:
        field2: field2
&nbs...

在C#中使用log4Net实现日志功能。

1、在App.config文件中配置基本的日志信息。  

 

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
</startup>

<configSections>

<section name="log4net" ty...

关于log4Net DLL引用的疑问。。高手请进>>>

问题
解决方案中有2个项目,一个是通用项目叫A,另一个项目叫B,A项目中引用了log4net的DLL,并在A.Utility类中提供了一个返回ILog的属性Logger。
 
B项目引用A项目,调用A.Utility.Logger获取这个属性时出错,但是B项目中引用了log4net.dll之后就好了,我不明白的是,既然A项目已经引用了DLL,已经能够提供logger,那么在B项目中为什么还要再次引用log4net.dll才能通过编译?

最佳回答

 我觉得是  你调用 A.Utility.Logger 这个...

使用类做为Dictionary<T,K>的key需什么要求?

问题
<P>&nbsp;</P>

最佳回答
没有要求

...

使用jquery实现表单的全选与全不选功能只能监听一次

问题
如图,功能可以实现,但是点击一次实现了全选后,取消全选,就不可以再次全选了。请问是出了什么问题

<!DOCTYPE html>
<html>
<head>
<title>斑马状表格实现</title>
<meta charset="utf-8">
<script type="text/javascript" src="./js/lib/jquery.js"></script>
</head>
<body>
<...

.net core 用引用log4net 写入日志

1. 安装需要应用的程序包
 

 
2.  准备配置文件  

<?xml version="1.0" encoding="utf-8"?>
<log4net>
<!-- Define some output appenders -->
<appender name="rollingAppender" type="log4net.Appender.RollingFileAppender">
<file value="Customlog\log.txt" ...

SpringBoot 开发项目日志

1、创建的父项目以及子项目
<packing>pom<packing> 项目里没有java代码,也不执行任何代码,只是为了聚合工程或传递依赖用的
 
2、子项目想要使用父项目中的依赖,在子项目中需要配置正确的父项目
<parent>
<!-- <artifactId>guli_parent</artifactId>-->
<!-- <groupId>com.luobin</groupId>-->
<!-- <ver...

文章标题:如何为Windows服务增加日志的功能。
文章链接:https://www.dianjilingqu.com/51471.html
本文章来源于网络,版权归原作者所有,如果本站文章侵犯了您的权益,请联系我们删除,联系邮箱:saisai#email.cn,感谢支持理解。
THE END
< <上一篇
下一篇>>