【问题标题】:How could I log that a Windows service is terminating because of a system shutdown?我如何记录 Windows 服务因系统关闭而终止?
【发布时间】:2010-02-24 18:08:52
【问题描述】:

我有一个诊断版本的服务,它在 OnStart() 和 OnStop() 方法中尽可能多地记录。

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

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

因为 SQL Server 正在关闭过程中,我无法发布到表对我来说是有道理的,但似乎由于时间问题,EventLog 也可能在服务之前关闭可以默认写在那里。

在关闭的情况下,MSSQLSERVER 在 EventLog 中报告一条信息消息:

SQL Server 由于系统关闭而终止。这只是一条信息性消息。无需用户操作。

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

【问题讨论】:

    标签: event-log


    【解决方案1】:

    您可以指定 Windows 服务的依赖项,使其需要其他服务。如果您指定对 EventLog 服务的依赖关系,则 Windows 将等到您的服务关闭后再关闭 Event Log。

    http://kb2.adobe.com/cps/400/kb400960.html 描述了如何通过修改几个注册表项来做到这一点。

    导航到 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services 并找到您需要的服务 设置依赖项。打开 右侧的“DependOnService”键 边。如果所选服务没有 有一个 'DependOnService' 键,然后 通过右键单击创建一个并 选择新建 > 多字符串值。在 值字段,输入名称 当前服务的所有服务 将取决于。每个服务名称必须 正确输入并在单独的 行。

    【讨论】:

    • 谢谢大卫——这就是我使用的解决方案。起初我希望以编程方式设置依赖项,但可能存在权限问题,我认为唯一可靠的方法是使用安装程序代码。虽然通过创建一个可以运行的 .reg 文件,我确实减轻了部署的复杂性。所以谢谢!
    【解决方案2】:

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

    【讨论】:

    • Frode——在我的最终解决方案中,我发现覆盖 OnShutdown() 也很有帮助,因为 OnStop() 似乎不会在系统关闭时引发。也谢谢!
    【解决方案3】:

    捕获SystemEvents.SessionEnding

    在 OnStart 上,您可以捕获并处理它

    喜欢

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

    【讨论】:

    • 他的问题不是捕获关闭事件,而是在他的服务尝试记录时记录器已经消失。
    【解决方案4】:

    您可以使用SystemEvents-Class 捕获Windows 事件。

    还可以查看events。 我认为您正在寻找的事件是:SystemEvents::PowerModeChanged Event 和/或 SystemEvents::SessionEnded

    【讨论】:

    • 他的问题不是捕获关闭事件,而是在他的服务尝试记录时记录器已经消失。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-03
    • 2011-01-24
    • 2018-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多