为什么我的C# Windows服务停止运行,但没有任何消息被写入应用程序事件日志?

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

你有检查过事件日志吗? - pms1969
3个回答

6

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


我选择了这条路线,看起来它正在工作(已经用我的代码更新了问题)。顺便说一句,我确实处理异常,但并不是在每个地方都有try/catch块。实现全局处理程序非常好,可以让我找出问题发生的位置。谢谢! - oscilatingcretin

3
听起来你的服务在没有进行任何形式的异常处理和/或日志记录的情况下意外失败了。 Windows服务不会自动将异常写入事件日志 - 这取决于您处理异常并(如果它们是致命的)将它们写入某个地方以便您可以诊断问题。
至少,我建议在某个地方设置日志文件(可能位于服务可执行文件夹中,或者最好是容易获取且不会违反权限问题的其他位置),并使用标准日志记录方法,所有异常处理程序都要调用以将其消息写入其中。

0

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

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

您可以在此处查看EventLogAppender的示例。但是,我建议首先使用最简单的FileAppender创建一个工作日志,然后再添加第二个用于事件日志的appender。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接