使用log4net在Windows服务中记录未处理的异常

时间:2017-06-20 06:40:11

标签: c# windows-services log4net

我正在开发Windows服务,C#,4.7 .NET Framework和log4net。

我想记录未处理的异常,但似乎log4net在Program.cs中无效。

using System;
using System.ServiceProcess;

namespace MyWindowsService
{
    static class Program
    {
        private static readonly log4net.ILog log =
            log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        static void Main()
        {
            AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;

            log4net.Config.XmlConfigurator.Configure();

            ServiceBase[] ServicesToRun;
            ServicesToRun = new ServiceBase[] 
            { 
                new MyService() 
            };
            ServiceBase.Run(ServicesToRun);
        }

        private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
        {
            log.ErrorFormat("UnhandledException: {0}", e.ToString());
        }
    }
}

我修改了MyService类以在OnStart方法上抛出异常,但我没有获取任何登录日志文件,我无法调试Windows服务应用程序看看是否调用CurrentDomain_UnhandledException

您知道如何记录未处理的例外情况吗?

1 个答案:

答案 0 :(得分:-1)

我目前正在开展一个类似的项目。带有log4net的Windows服务,需要记录未处理的异常。我注意到的第一件事是,没有设置配置文件。如果这不是故意的,你应该在命名空间上面添加这样的一行:

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

我做的第二件事不是使用UnhandledException事件处理程序,而是将我的Main()逻辑包含在try catch中:

static void Main()
        {
            try
            {
                log4net.Config.XmlConfigurator.Configure();

                ServiceBase[] ServicesToRun;
                ServicesToRun = new ServiceBase[] 
                { 
                    new MyService() 
                };
                ServiceBase.Run(ServicesToRun);
            }
            catch(Exception ex)
            {
                log.Fatal("Unhandled", ex);
            }
        }