安装Windows服务时是否需要手动创建Windows事件日志源

时间:2009-09-27 22:04:55

标签: c# .net windows-services event-log

我在C#中开发了一个Windows服务。我用Visual Studio 2008创建了一个安装程序,它安装了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);
}

2 个答案:

答案 0 :(得分:12)

在我看来,ServiceInstaller在安装过程中会自动创建一个与服务同名的DataSource,因此不需要任何额外的代码。

来自ServiceInstaller文档

  

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

答案 1 :(得分:8)

您应该在安装期间注册它们,因为服务帐户可能没有在运行时执行此操作的权限:How to: Add Your Application as a Source of Event Log Entries

  

默认情况下,如果您尝试编写   没有先注册的入境   你的组件作为有效的来源,   系统自动注册   使用事件日志来源   Source属性的值为   源字符串。一般来说,创建   期间的新事件来源   安装您的应用程序。这个   为操作系统留出时间   刷新其已注册的列表   事件源及其配置。   如果操作系统没有   刷新了事件源列表   而你试图写一个事件   新的源,写操作   将失败。如果创建源   在安装过程中不是一种选择,   然后尝试很好地创建源   在第一次写操作之前,   也许在你申请期间   初始化。如果你选择这个   方法,请确保您的初始化   代码正在与管理员一起运行   计算机上的权利。这些权利   是创建新事件所必需的   来源

幸运的是ServiceInstaller让你很容易,就像你已经发现的那样。