2011-02-02 1 views
7

У меня есть проект установки, который устанавливает службу Windows.Проект установки для службы Windows и журнала событий

Мы регистрируем источник журнала событий в пользовательском журнале, который должен использоваться проектом winservice (как и почему не важно).

Моя проблема заключается в том, что проект установки пытается создать источник журнала событий по умолчанию. Поступая так, получите сообщение об ошибке ("Error 1001" source XXX already exists on local computer) и откат.

Я искал всюду, и я не могу найти, где делается регистрация или как я могу отключить ее.

Как заставить службу Windows или проект установки НЕ создавать источник журнала событий?

ответ

7

Вы можете удалить по умолчанию EventLogInstaller:

namespace MyService 
{ 
    [RunInstaller(true)] 
    public partial class ProjectInstaller : Installer 
    { 
     public ProjectInstaller() 
     { 
      InitializeComponent(); 

      // Remove the default Event Log Installer 
      EventLogInstaller DefaultInstaller = null; 
      foreach (Installer installer in serviceInstaller1.Installers) 
      { 
       if (installer is EventLogInstaller) 
       { 
        DefaultInstaller = (EventLogInstaller)installer; 
        break; 
       } 
      } 
      if (DefaultInstaller != null) 
      { 
       serviceInstaller1.Installers.Remove(DefaultInstaller); 
      } 
     } 
    } 
} 

в качестве альтернативы, вы можете изменить Log свойство:

foreach (Installer installer in serviceInstaller1.Installers) 
{ 
    if (installer is EventLogInstaller) 
    { 
     ((EventLogInstaller)installer).Log = "MyLog"; 
     break; 
    } 
} 

Теперь события будут успешно зарегистрированы до MyLog, а события запуска/остановки службы будут по-прежнему регистрироваться в журнале .

(источник: serviceInstaller component and its default EventLogInstaller)

+0

Обратите внимание, что это важно включить "serviceInstaller1" в строке 'Еогеасп (инсталлятор Installer в serviceInstaller1.Installers)'. Я написал его как 'foreach (установщик установщика в this.Installers)'. Это построено отлично, и проект установки создал файл MSI. Но ошибка продолжалась, когда я пытался установить службу. Только когда я изменил «this.Installers» на «serviceInstaller1.Installers», что он исправил ошибку. –

2

Это только предположение, основанное на моих тестах.

Проект установщика (или класс WindowService) автоматически создает источник события с тем же именем, что и myService.ServiceName. Это наиболее вероятно, потому что сообщения Start/Stop записываются в журнал каждый раз, когда служба запускается/останавливается. И эти сообщения нуждаются в источнике.

Другими словами: Вам не нужно создавать источник с тем же именем, что и ServiceName, как это сделано для вас.

3

Я полагаю, что при удалении службы что-то неправильно удалено, особенно в журнале событий.

Для восстановления возможности переустановить службу снова, я обнаружил (thanks to this article), необходимо удалить этот ключ в реестре (regedit.exe):

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\YOURSERVICENAME