2009-09-27 94 views
12

我已经在C#中开发了Windows服务。我用Visual Studio 2008创建了一个安装程序,它安装了Windows服务。目前为止,一切都很好。我想确保在安装时创建事件源,以便运行时的任何错误/异常情况都能正确记录到Windows事件日志中。安装Windows服务时是否需要手动创建Windows事件日志源

是否事件源都会自动创建(删除)作为Windows服务安装(和卸载)的一部分,还是我来处理这个自己并创建一个自定义操作来创建和删除它,如下所示?

protected override void OnBeforeInstall(IDictionary savedState) 
{ 
    base.OnBeforeInstall(savedState); 

    if (!EventLog.SourceExists(ServiceName)) 
     EventLog.CreateEventSource(ServiceName, "Application"); 
} 

protected override void OnAfterUninstall(IDictionary savedState) 
{ 
    base.OnAfterInstall(savedState); 

    if (EventLog.SourceExists(ServiceName)) 
     EventLog.DeleteEventSource(ServiceName); 
} 

回答

12

在我看来,像ServiceInstaller自动创建安装具有相同名称作为服务期间的数据源,所以没有需要任何额外的代码。

ServiceInstaller文档

当进行安装时,自动创建一个EventLogInstaller安装与ServiceBase派生类相关联的事件日志源。此源的Log属性由ServiceInstaller构造函数设置为计算机的应用程序日志。当您设置ServiceInstaller的ServiceName(应该与服务的ServiceBase .. ::。ServiceName相同)时,Source自动设置为相同的值。在安装失败时,源的安装与先前安装的服务一起回滚。

8

你应该将它们注册在安装过程中,因为服务帐户可能没有权限运行时可以这样做:How to: Add Your Application as a Source of Event Log Entries

默认情况下,如果你尝试写一个 条目没有先已将 组件注册为有效源, 系统会自动使用源属性的 值作为 源字符串将 源与事件日志进行注册。通常,在安装应用程序的 期间创建 新事件源。这 时间,让操作系统 刷新其注册 事件源和它们的配置清单。 如果操作系统没有更新其事件源列表 并且您尝试使用 写入新事件源,则写操作 将失败。如果在安装过程中创建源 不是选项,则 然后尝试在第一次写入操作之前创建源井 ,可能在您的应用程序 初始化期间创建源井 。如果你选择了这个 方法,确保您的初始化代码 与管理员在计算机上运行 权利。需要创建新的事件 来源

这些权利幸运的是,ServiceInstaller使得它可以很容易的,因为你已经发现了。