我正在开发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
。
您知道如何记录未处理的例外情况吗?
答案 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);
}
}