我在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);
}
答案 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让你很容易,就像你已经发现的那样。