15

我用 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);
}
4

2 回答 2

16

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

来自ServiceInstaller文档

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

于 2009-11-01T22:22:16.327 回答
9

您应该在安装期间注册它们,因为服务帐户在运行时可能没有这样做的权限:如何:将您的应用程序添加为事件日志条目的源

默认情况下,如果您在未先将组件注册为有效源的情况下尝试编写条目,系统会使用 Source 属性的值作为源字符串自动将源注册到事件日志中。通常,在安装应用程序期间创建新的事件源。这允许操作系统有时间刷新其已注册事件源及其配置的列表。如果操作系统尚未刷新其事件源列表并且您尝试使用新源写入事件,则写入操作将失败。如果在安装过程中创建源不是一个选项,那么尝试在第一次写入操作之前创建源,可能在您的应用程序初始化期间。如果选择这种方法,确保您的初始化代码在计算机上以管理员权限运行。创建新事件源需要这些权限

幸运的是,ServiceInstaller让它变得非常简单,正如您已经发现的那样。

于 2009-09-27T22:14:56.710 回答