CreateEventSource 不创建事件日志条目并且 windows 服务无法启动

CreateEventSource doesn't create event log entry and windows service can't be launched

我正在开发一项新的 windows 服务,并且我遵循此 instruction 中提供的步骤。

在服务class中,我做的事情和文章差不多

static EventLog _eventLog;

public CMSMetadata()
{
    InitializeComponent();

    _eventLog = new EventLog();
    if (!EventLog.SourceExists("CMSMetadata_Processing"))
    {
        EventLog.CreateEventSource(new EventSourceCreationData("CMSMetadata_Processing", "CMSMetadata"));
    }
    _eventLog.Source = "CMSMetadata_Processing";
    _eventLog.Log = "CMSMetadata";
}

protected override void OnStart(string[] args)
{
    _eventLog.WriteEntry("In OnStart.", EventLogEntryType.Information);
}

在我安装并尝试启动服务后,它显示以下错误

Error 1053: the service did not respond to the start or control request in a timely fashion

而且我还注意到,当我在事件查看器中查找时,CreateEventSource() 没有创建事件日志条目。

我发现 this SO post 正在讨论我面临的 1053 错误,但 none 的解决方案对我有用。

我有confirmed/tried

  1. 服务以发布方式构建。
  2. 同时安装 InstallUtilManagedInstallerClass.InstallHelper()
  3. 框架版本和我安装的一致,其实我 尝试了 4.5.2 和 4.7.2 以防万一它确实与 框架。
  4. 服务 运行 作为本地系统。
  5. 配置没问题
  6. 如果我删除所有与事件日志相关的代码,服务就可以成功启动。

然后我想如果服务无法正确创建事件日志条目,也许我可以提前创建条目作为解决方法。

但是,这样一来,我连服务都装不上了。 下面的安装日志 (CMSMetadata.InstallLog) 表明无论我是否使用 CreateEventSource(),安装都会以某种方式创建事件 source

Installing assembly 'C:\temp\GisSoftware\CMSMetadata\CMSMetadata.exe'.
Affected parameters are:
   logtoconsole = 
   logfile = C:\temp\GisSoftware\CMSMetadata\CMSMetadata.InstallLog
   assemblypath = C:\temp\GisSoftware\CMSMetadata\CMSMetadata.exe
Installing service CMSMetadata...
Service CMSMetadata has been successfully installed.
Creating EventLog source CMSMetadata in log Application...
Rolling back assembly 'C:\temp\GisSoftware\CMSMetadata\CMSMetadata.exe'.
Affected parameters are:
   logtoconsole = 
   logfile = C:\temp\GisSoftware\CMSMetadata\CMSMetadata.InstallLog
   assemblypath = C:\temp\GisSoftware\CMSMetadata\CMSMetadata.exe
Restoring event log to previous state for source CMSMetadata.
Service CMSMetadata is being removed from the system...
Service CMSMetadata was successfully removed from the system.

总结一下我的问题,在 windows 服务中使用事件日志我错过了什么?

服务似乎默认创建事件日志。在生成 Installer.

之前,我可能应该将服务的 AutoLog 属性 设置为 false

ServiceInstaller 中找到 EventLogInstaller 并修改日志和源解决了我的问题(还记得删除服务 ctor 中创建的事件日志条目)。

public ProjectInstaller()
{
    InitializeComponent();

    EventLogInstaller installer = this.Installers.OfType<ServiceInstaller>().First()
        .Installers.OfType<EventLogInstaller>().First();

    installer.Source = _source;
    installer.Log = _logName;
}

此外,在安装过程中创建事件日志似乎比服务 ctor 更好,因为 LocalSystem 访问注册表的权限似乎受到限制。

参考:Easiest language for creating a Windows service