2010-02-24 47 views
4

我有一个服务的诊断版本,尽可能在OnStart()和OnStop()方法中记录日志。如何记录Windows服务因系统关闭而终止?

我无法捕获的一个事件是计算机在物理上重新启动时。我的日志记录功能通常将其输出记录到数据库中的表中,但是当它不可用时,它会发送到EventLog。

在重新启动时,我的服务既不记录到表格也不记录到EventLog。

由于SQL Server正处于关闭过程中,所以我无法发布到表中,这对我来说很有意义,但它似乎也是由于计时问题,EventLog可能也会在服务可以默认写在那里。

在停机的情况下,MSSQLSERVER在事件日志报告的信息消息:

SQL Server正在因为系统关闭的终止。这仅是一条信息性消息。无需用户操作。

有没有办法为我的服务做类似的事情?

回答

3

您可以指定Windows服务的依赖关系,以使其需要其他服务。如果您指定EventLog服务的依赖关系,则Windows将关闭事件日志之前一直等到服务关闭。

http://kb2.adobe.com/cps/400/kb400960.html描述了如何通过修改一些注册表项来实现它。

导航到 HKEY_LOCAL_MACHINE \系统\ CurrentControlSet \服务 并找到您需要 设置为依赖该服务。在右侧 一侧打开 'DependOnService'键。如果所选服务没有 具有'DependOnService'键,则 通过右键单击创建一个,并且选择New> Multi-String Value。在 的值字段中,输入当前服务 将依赖的所有服务的名称 。每个服务名称必须正确输入 ,并在单独的 行中输入。

+0

感谢大卫 - 这是我使用的解决方案。起初我希望以编程方式设置依赖关系,但是如果出现可能的权限问题,我认为唯一可行的方法是使用安装程序代码。尽管通过创建一个可以运行的.reg文件,我的确减轻了部署的复杂性。那谢谢啦! – davecoulter 2010-02-24 18:56:24

3

您可以在服务中覆盖OnShutdown方法。它将在机器关闭时被调用。从该方法写入事件日志,然后调用base.OnShutdown()。

+0

弗罗德 - 在我的最终解决,我发现,这是也有利于覆盖OnShutdown()因为OnStop()在系统关闭时似乎不会引发。也谢谢! – davecoulter 2010-02-24 18:59:04

0

捕捉SystemEvents.SessionEnding

在OnStart中,你可以捕捉它和处理

Microsoft.Win32.SystemEvents.SessionEnding += new Microsoft.Win32.SessionEndingEventHandler(this.zomgRebootinglol); 
+0

他的问题是没有捕获关机事件,它的记录器在服务尝试记录时已经消失。 – 2010-02-24 18:16:14

0

您可以通过使用SystemEvents-Class捕获窗口的事件。

也看看events。 我认为你正在寻找的事件是:SystemEvents :: PowerModeChanged事件和/或SystemEvents :: SessionEnded

+0

他的问题没有捕获关闭事件,它的记录器在他的服务尝试登录时已经消失。 – 2010-02-24 18:16:39

相关问题