• 如何为Windows服务增加Log4net和EventLog的日志功能。


    一、简介

        最近在做一个项目的时候,需要该项目自动启动、自动运行,不需要认为干预。不用说,大家都知道用什么技术,那就是 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 static readonly log4net.ILog logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
     15 
     16         private int eventId = 1;
     17 
     18         /// <summary>
     19         /// 服务的构造函数
     20         /// </summary>
     21         public MyWindowsService()
     22         {
     23             //记录到event log中,地址是 C:\Windows\System32\winevt\Logs (双击查看即可,文件名为MyNewLog)
     24             InitializeComponent();
     25             if (!System.Diagnostics.EventLog.SourceExists("PatrickLiuEventSource"))
     26             {
     27                 System.Diagnostics.EventLog.CreateEventSource("PatrickLiuEventSource", "PatrickLog");
     28             }
     29             MyEventLog.Source = "PatrickLiuEventSource";
     30             MyEventLog.Log = "PatrickLog";            
     31         }
     32 
     33         /// <summary>
     34         /// 服务开始启动。
     35         /// </summary>
     36         /// <param name="args"></param>
     37         protected override void OnStart(string[] args)
     38         {
     39             logger.Info("服务启动,启动时间:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
     40             MyEventLog.WriteEntry("开启服务。");
     41             Log("In OnStart.");
     42 
     43             #region 可以定义个人的服务
     44 
     45             Timer timer = new Timer();
     46             timer.Interval = 60000; // 60 seconds 60秒执行一次
     47             timer.Elapsed += new ElapsedEventHandler(OnTimer);
     48             timer.Start();
     49 
     50             #endregion
     51         }
     52 
     53         /// <summary>
     54         /// 服务开始关闭
     55         /// </summary>
     56         protected override void OnStop()
     57         {
     58             logger.Info("服务停止,停止时间:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
     59             MyEventLog.WriteEntry("关闭服务。");
     60 
     61             #region 可以定义要结束服务要做的事情。
     62 
     63             Log("In OnStop.");
     64 
     65             #endregion
     66         }
     67 
     68         /// <summary>
     69         /// 继续服务
     70         /// </summary>
     71         protected override void OnContinue()
     72         {
     73             logger.Info("服务暂停,暂停时间:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
     74             MyEventLog.WriteEntry("In OnContinue.");
     75             Log("In OnContinue.");
     76         }
     77 
     78         /// <summary>
     79         /// 定时器中定时执行的任务
     80         /// </summary>
     81         /// <param name="sender"></param>
     82         /// <param name="args"></param>
     83         public void OnTimer(object sender, ElapsedEventArgs args)
     84         {
     85             // TODO: Insert monitoring activities here.
     86             logger.Info("我开始运行了,时间:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
     87             MyEventLog.WriteEntry("我开始运行了!", EventLogEntryType.Information, eventId++);
     88             Log("the timer");
     89         }
     90 
     91         /// <summary>
     92         /// 记录到指定路径:D:\log.txt
     93         /// </summary>
     94         /// <param name="message"></param>
     95         private static void Log(string message)
     96         {
     97             using (FileStream stream = new FileStream("D:\\log.txt", FileMode.Append))
     98             using (StreamWriter writer = new StreamWriter(stream))
     99             {
    100                 writer.WriteLine($"{DateTime.Now}:{message}");
    101             }
    102         }
    103     }
    104 }

            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目录,我们看到了日志文件。

                

    三、总结

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

  • 相关阅读:
    生成大小字母以及数字混乱的6位验证码
    重写吃货联盟
    集合练习:登录注册功能
    出现并解决Navicat 报错:1130-host ... is not allowed to connect to this MySql server,MySQL
    mysql在linux的安装
    Spring4分别整合mongo2.X和3.0
    oracle数据库使用plsql(64位)时出现的问题
    spring的CXF远程服务
    spring的定时任务或者说自动任务
    jquery节点查询
  • 原文地址:https://www.cnblogs.com/PatrickLiu/p/15836824.html
Copyright © 2020-2023  润新知