为什么我的c #Windows服务在没有任何消息写入应用程序事件日志的情况下停止运行?

时间:2012-05-21 12:32:44

标签: c# .net .net-4.0 windows-services windows-server-2003

我是Windows服务的新手。我为我的c#Windows服务创建了一个安装程序,并且服务器上的安装(Windows Server 2003)似乎已经起作用。当它启动时,会将Service started successfully写入日志。当它停止时,它会写Service stopped successfully。但是,有时服务会在没有向日志写入任何内容的情况下停止运行,因此我会手动启动它。当我稍后查看日志时,它会按预期显示Service started successfully。奇怪的是,在日志中连续两次看到它显然缺少一个服务以某种方式停止运行的条目。

可能导致这种情况的原因是什么?我将服务设置为自动并安装它以便为所有用户运行。我的印象是,这意味着只要机器启动,服务就会自动启动。我如何找出它停止的原因?崩溃的服务会自动写入事件日志,还是我必须以他们记录崩溃原因的方式处理异常?

修改:其他一些信息:

  • 我已将其设置为以本地系统帐户登录
  • 在恢复选项下,我将其设置为在第一次失败时重新启动。我没有为第二次或随后的失败做任何事情。

更新:应答者推荐了一个全局异常处理程序。虽然我不会将其作为永久性修复来实现,但它至少可以帮助我找出问题发生的位置。我实际上用我安装的服务对它进行了测试,它确实有效我发现未处理的异常实际上会使服务崩溃而根本不向日志写任何内容。我认为它至少会报告一些应用程序错误,但它没有。

static void Main()
{
    AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);

    //other code here
}

static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
    Utilities.WriteIt(e.ExceptionObject as Exception);
}

3 个答案:

答案 0 :(得分:5)

处理异常总是最好的。至少使用全局异常处理程序并将其写入日志文件

答案 1 :(得分:3)

听起来您的服务在没有进行任何形式的异常处理和/或日志记录的情况下意外失败。 Windows服务不会自动将异常写入事件日志 - 由您来处理异常和(如果它们是致命的)将它们写出来以便您可以诊断问题。

至少,我建议在某个地方使用日志文件(可能在服务可执行文件夹中,或者最好在其他易于访问的地方,并且不会与许可问题发生冲突)和标准的日志记录方法异常处理程序调用将消息写入。

答案 2 :(得分:0)

如果服务由于某些异常而意外退出,我不确定它会自动结束在事件日志中。

我强烈建议使用log4net之类的日志记录套件来进行更全面的日志记录。您将能够提供大量日志记录“级别”(调试跟踪以查看是否已达到某些代码,重要事件的信息跟踪,记录异常的错误跟踪)。

您可以查看here以获取EventLogAppender的示例。但是,我建议首先获取FileAppender,这是最容易创建的日志之一,先工作,然后为事件日志添加第二个appender。