2010-05-23 11 views
4

Я пытаюсь получить мою .Net службу Windows, чтобы перейти к пользовательскому журналу событий. Я использую EventLogInstaller для создания журнала событий и источника при установке приложения. Я прочитал here, что для регистрации источника требуется некоторое время, чтобы они рекомендовали перезапустить приложение, прежде чем пытаться записать в журнал.Как написать в журнал событий?

Поскольку это служба Windows, мне не нужно было принудительно перезагрузить компьютер или заставить пользователя вручную запустить службу, поэтому я использую этот код, чтобы дождаться существования журнала, а затем запустите службу автоматически.

while (!(EventLog.Exists("ManageIT") || EventLog.SourceExists("ManageIT Client Service"))) 
{ 
    Thread.Sleep(1000); 
} 

System.ServiceProcess.ServiceController controller = new System.ServiceProcess.ServiceController("ManageIT.Client.Service"); 
controller.Start(); 

Моя проблема заключается в том, что события из службы по-прежнему записываются в журнал приложений, и хотя я могу видеть свой собственный журнал в редакторе реестра не отображаются в Windows 7 Event Viewer.

Любая помощь будет очень признательна.

+1

ли вы когда-нибудь решить эту проблему? У меня то же самое происходит здесь. –

+0

Да, у меня тоже. И я в ярости. –

ответ

3

Попробуйте этот фрагмент:

редактировать - предостережение: если пользователь работает код не имеет права администратора, это будет сгенерировано исключение. Так как это так (и если у пользователя не будет этих прав), то лучше всего использовать лог, и просто написать ему. см: The source was not found, but some or all event logs could not be searched

if (!EventLog.SourceExists("MyApplicationEventLog")) 
{ 
    EventSourceCreationData eventSourceData = new EventSourceCreationData("MyApplicationEventLog", "MyApplicationEventLog"); 
    EventLog.CreateEventSource(eventSourceData); 
} 

using (EventLog myLogger = new EventLog("MyApplicationEventLog", ".", "MyApplicationEventLog")) 
{ 
    myLogger.WriteEntry("Error message", EventLogEntryType.Error); 
    myLogger.WriteEntry("Info message", EventLogEntryType.Information); 
} 
+2

Это просто стандартный способ записи в журнал событий. Моя проблема заключается в том, что даже если у меня создан настраиваемый журнал событий. События, которые я пишу, по-прежнему попадают в журнал приложений, а не мой пользовательский. Даже при использовании EventLog eventLog = новый EventLog («ManageIT»); eventLog.Source = «Служба клиентов ManageIT»; – TheDuke

+0

@ Марко, хотя он уже одобрен, я честно чувствую, что редактирование должно быть комментарием или другим ответом. Это не первый или последний «плохой» ответ, принятый по вопросу. Просто потому, что вопрос имеет принятый ответ, он не делает его не подлежит ответственности. – Khez

+0

@Khez Я отмечен изменением, потому что я просмотрел чье-то чужое правление и разъяснил, что было добавлено - хотя я согласен, что есть случай, когда это комментарий. – marko

1

Это звучит, как вы пишете в журнал событий, как это:

EventLog.WriteEntry("Source", "Message"); 

Это будет записывать в журнал приложений.

Если вы используете код в сообщении simons с созданием myLogger, вы можете указать имя журнала.

5

По умолчанию, когда служба установлена, источник связывается с журналом приложений. Если мы изменим эту связь в более поздней точке, системе потребуется перезагрузка.

Однако мы можем предотвратить объединение службы с журналом приложения, установив для свойства autolog значение false в конструкторе сервиса (класс, который наследуется от Servicebase). http://msdn.microsoft.com/en-us/library/system.serviceprocess.servicebase.autolog.aspx

+0

Это был ответ для меня. Я неправильно создал журнал в разделе «Приложение», я удалил и повторно создал его правильно, но он все еще написал приложение. Я перезагрузился. – Mark

0

я сделал что-то вроде этого:

 var logName = EventLog.LogNameFromSourceName("MyApp", Environment.MachineName); 

     //delete the source if it associated with the wrong Log 
     if (!string.IsNullOrEmpty(logName) & logName != "MyLog") 
     { 
      EventLog.DeleteEventSource("MyApp", Environment.MachineName); 
     } 

     if (!EventLog.SourceExists("MyApp")) 
     { 
      EventLog.CreateEventSource("MyApp", "MyLog"); 
     } 
Смежные вопросы