【问题标题】:When/Where should I create the EventLogSource in Windows Service?我应该何时/在何处在 Windows 服务中创建 EventLogSource?
【发布时间】:2011-05-09 15:34:56
【问题描述】:

我正在使用 C# 和 .Net framework 4.0 开发 Windows 服务。

为了让 Windows 服务将条目写入 EventLog,如果不存在,我需要检查并创建 Event Log Source。

if (EventLog.SourceExists("MySource") == false)
            EventLog.CreateEventSource("MySource", "MyLog"); 

我对应该在哪里检查和创建事件日志源感到困惑。我应该在 Windows Service 的 Constructor 方法中创建还是在 Installer Service 的 Constructor 方法中创建?

当我用谷歌搜索时,我发现了两种方式。那么,您能否为我提供最佳实践建议?谢谢。

【问题讨论】:

  • 无论您将代码放在何处,请记住您可能会遇到权限问题。服务帐户有权写入事件日志但无权创建事件源的情况并不少见。

标签: c# c#-4.0 windows-services


【解决方案1】:

我认为在安装程序中添加事件日志源会更好,但我也会检查以确保在服务启动时存在事件日志源。此外,您可能希望使用安装程序事件之一,而不是在构造函数中添加事件日志源。我以前没有这样做过,但我认为AfterInstall 事件看起来是添加事件日志源的好地方(有关更多信息,请参阅此问题的答案:Automatically start a Windows Service on install)。

使用安装程序服务添加事件日志源的原因是因为(正如@MusiGenesis 指出的那样)您更有可能拥有在安装应用程序时创建事件日志源所需的安全访问权限。当服务运行时,它可能被设置为无权创建事件日志源的帐户。

在服务本身中,我会检查以确保事件日志源也存在。如果它不存在,您可以尝试重新创建它,如果尝试失败,那么您可以采取最适合您需要的任何操作。例如:

  • 将错误消息记录到文件中 系统某处说明日志记录 是因为服务被禁用了
  • 抛出异常,使服务不 开始(这应该会导致 Windows 编写自己的事件日志条目)
  • 完全禁用日志记录等

如果您在服务中检查(并尝试创建不存在的事件日志源),那么您将获得额外的小好处,即该服务能够容忍用户或其他程序删除您的服务的事件日志源是依靠。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-18
    • 2011-11-25
    相关资源
    最近更新 更多