1. 程式人生 > >使用Topshelf創建Windows服務,服務中使用log4net記錄日誌

使用Topshelf創建Windows服務,服務中使用log4net記錄日誌

catch handler begin ilo send 記錄 ner eset .config

一、新建一個控制臺應用程序

二、使用nuget引用 TopShelf和log4net插件

三、log4net配置文件添加

  在根目錄增加log4net.config文件和logHelper類庫的添加

   log4net.config內容如下:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net
"/> </configSections> <log4net> <!--信息日誌配置--> <appender name="InfoLogFileAppender" type="log4net.Appender.RollingFileAppender"> <param name="File" type="" value="Log\\Info\\" /> <param name="AppendToFile" value="true" /> <param name="
MaxSizeRollBackups" value="20"/> <param name="RollingStyle" value="Date" /> <param name="DatePattern" value="yyyy-MM-dd‘.log‘" /> <param name="StaticLogFileName" value="false" /> <layout type="log4net.Layout.PatternLayout,log4net"> <param name="
ConversionPattern" value="%d [%5p] %c: %m%n" /> </layout> <filter type="log4net.Filter.LevelRangeFilter,log4net"> <levelMin value="INFO" /> <levelMax value="INFO" /> </filter> </appender> <!--錯誤日誌配置--> <appender name="ErrorLogFileAppender" type="log4net.Appender.RollingFileAppender"> <param name="File" type="" value="Log\\Error\\" /> <param name="AppendToFile" value="true" /> <param name="MaxSizeRollBackups" value="20"/> <param name="RollingStyle" value="Date" /> <param name="DatePattern" value="yyyy-MM-dd‘.log‘" /> <param name="StaticLogFileName" value="false" /> <layout type="log4net.Layout.PatternLayout,log4net"> <param name="ConversionPattern" value="%d [%5p] %c: %m%n" /> </layout> <filter type="log4net.Filter.LevelRangeFilter,log4net"> <levelMin value="ERROR" /> <levelMax value="ERROR" /> </filter> </appender> <root> <level value="ALL" /> <appender-ref ref="ErrorLogFileAppender" /> <appender-ref ref="InfoLogFileAppender" /> </root> <logger name="ALL" > <level value="ALL" /> <appender-ref ref="ErrorLogFileAppender"></appender-ref> <appender-ref ref="InfoLogFileAppender"></appender-ref> </logger> </log4net> </configuration>

  logHelper類庫:

using log4net;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace WindowsService1
{
    public class LogHelper
    {
        public static ILog GetLog<T>(T t)
        {
            ILog _log = LogManager.GetLogger("");
            if (t != null)
            {
                _log = LogManager.GetLogger(t.GetType());
            }
            return _log;
        }
    }
}

四、編寫服務功能類【每3秒打印一個日誌】

using log4net;
using System;
using System.IO;
using System.Reflection;
using System.Timers;

namespace WindowsService1
{
    public class TestWriteDate
    {
        readonly Timer _timer;
        public TestWriteDate()
        {
            _timer = new Timer(3000)
            {
                AutoReset = true,
                Enabled = true
            };
            _timer.Elapsed += delegate (object sender, System.Timers.ElapsedEventArgs e)
            {
                LogHelper.GetLog(this).Info(string.Format("DATE: {0}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")));
                LogHelper.GetLog(this).Error("測試出錯!!!", new Exception("dfsafdsafddsafdsa"));
                try
                {
                    int i = 0;
                    int j = 10 / i;
                }
                catch (Exception ex)
                {
                    LogHelper.GetLog(this.GetType()).Error(ex.Message, ex);
                }
            };
        }

        public void Start()
        {
            LogHelper.GetLog(this).Info("開始執行");
        }

        public void Stop()
        {
            LogHelper.GetLog(this).Info(string.Format("結束執行") + Environment.NewLine + Environment.NewLine);
            _timer.AutoReset = false;
            _timer.Enabled = false;
        }
    }
}

五、與TopShelf集成

  Program.cs的代碼:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.ServiceProcess;
using System.Text;
using System.Threading.Tasks;
using Topshelf;

namespace WindowsService1
{
    static class Program
    {
        /// <summary>
        /// 應用程序的主入口點。
        /// </summary>
        static void Main()
        {
            string assemblyFilePath = Assembly.GetExecutingAssembly().Location;
            string assemblyDirPath = Path.GetDirectoryName(assemblyFilePath);
            string configFilePath = assemblyDirPath + "\\log4net.config";
            log4net.Config.XmlConfigurator.Configure(new FileInfo(configFilePath));
            HostFactory.Run(c =>
            {
                c.Service<TestWriteDate>((x) =>
                {
                    x.ConstructUsing(name => new TestWriteDate());
                    x.WhenStarted((t) => t.Start());
                    x.WhenStopped((t) => t.Stop());
                });
                c.RunAsLocalSystem();
                //服務描述
                c.SetDescription("TEST_SERVICES");
                //服務顯示名稱
                c.SetDisplayName("TEST_SERVICES");
                //服務的真實名稱
            });
        }
    }
}

  六、服務的安裝與卸載

  1、安裝 install.bat

@echo begin...
cd /d %~dp0
WindowsService1.exe install
net start TEST_SERVICES
pause

  2、卸載 uninstall.bat

@echo unInstall...
cd /d %~dp0
WindowsService1.exe uninstall
pause

 七、源碼

  點擊下載

使用Topshelf創建Windows服務,服務中使用log4net記錄日誌