为什么我的事件日志源一直被放在“应用程序”下?在注册表中,而不是

本文关键字:应用程序 注册表 log 日志 事件 我的 一直 为什么 | 更新日期: 2023-09-27 18:02:30

我正在尝试创建一个windows服务,我需要它能够写入事件日志。我在我的Service项目中添加了一个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"中注册)。源属性和Log属性必须匹配,或者您可以将Log设置为空字符串,它将自动匹配到源属性'。

我发现,如果我在应用程序文件夹下删除ccs_wscln注册表项,当我启动服务时,它将运行并在EventLog下生成ccs_wscln_log条目。所以我的问题是,当我安装应用程序时,为什么它会在应用程序下自动为我创建一个条目,以及我如何防止它这样做?

我在SO上发现了另一个帖子,说如果我之前在应用程序下安装了它,我需要重新启动我的计算机,所以我尝试了,但是当我重新加载解决方案时,我甚至不能打开设计器,因为它抱怨注册表项缺失,它仍然会安装在应用程序下。

为什么我的事件日志源一直被放在“应用程序”下?在注册表中,而不是<log>

我创建了一个使用c#从零开始创建Windows服务的教程。我解决了写入特定于应用程序的日志的问题。

我认为,您需要在ServiceInstaller类中执行以下操作。

this.Installers.Clear();

上面的代码需要在您添加一系列安装程序之前。

这是因为,EventLogInstaller是默认添加的。调用clear将删除它。或者,您可以循环遍历安装程序集合,选择特定的类型(EventLogInstaller)并为其分配所需的LogName和EventSource名称。