10

我对 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);
}
4

3 回答 3

6

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

于 2012-05-21T12:52:24.650 回答
3

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

至少,我会在某个地方推荐一个日志文件(可能在服务可执行文件夹中,或者最好在其他容易访问且不会与权限问题发生冲突的地方)和所有异常处理程序的标准日志记录方法打电话给他们写消息。

于 2012-05-21T12:54:20.600 回答
0

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

我强烈推荐使用log4net 之类的日志套件来进行更彻底的日志记录。您将能够提供多种日志记录“级别”(调试跟踪以查看您是否到达某些代码、重要事件的信息跟踪、记录异常的错误跟踪)。

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

于 2012-05-21T13:03:14.433 回答