我正在尝试创建一个Windows服务,我需要它才能写入事件日志。我已将EventLog
组件添加到我的服务项目中,并将Log
属性设置为ccs_wscln_log
,将Source
属性设置为ccs_wscln
(同名)作为服务)。
我也为这个项目创建并安装了它。我的问题是,无论何时安装该服务,它都会在其下创建ccs_wscln
注册表项
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\Application
什么时候应该
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\ccs_wscln_log
。
这个问题是,当我尝试启动服务时,出现错误
“源'ccs_wscln'未在日志'ccs_wscln_log'中注册。(它在日志'Application'中注册。)源和日志属性必须匹配,或者您可以将日志设置为空字符串,它将自动匹配源属性'。
我发现如果删除Application文件夹下的ccs_wscln注册表项,当我启动该服务时,它将运行并在EventLog下生成ccs_wscln_log条目。所以我的问题是,当我安装应用程序时,为什么它会在Application下自动为我创建一个条目,我该如何阻止它这样做呢?
我在SO上发现了另一篇帖子说如果我之前在应用程序之前安装了它我需要重新启动我的计算机,所以我尝试了但是当我重新加载解决方案时,我甚至无法提起设计师,因为它抱怨注册表项丢失了,它仍然会在Application下安装。
答案 0 :(得分:1)
我创建了一个使用C#从头开始创建Windows服务的教程。我解决了写入特定于应用程序的日志的问题。有关详细信息,请参阅步骤9 here。
答案 1 :(得分:0)
我认为,您需要在ServiceInstaller类中进行跟踪。
this.Installers.Clear();
以上代码需要在您添加一系列安装程序之前。
这是因为默认情况下会添加EventLogInstaller。呼叫清除将删除它。 或者,您可以遍历安装程序集合,选择特定类型(EventLogInstaller)并为其分配所需的LogName和EventSource名称。