Как записать в пользовательский журнал событий? - PullRequest
4 голосов
/ 23 мая 2010

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

Поскольку это служба 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.

Любая помощь будет высоко ценится.

Ответы [ 4 ]

5 голосов
/ 27 июня 2013

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

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

3 голосов
/ 23 мая 2010

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

edit - предостережение: если пользователь, выполняющий код, не имеет прав администратора, это вызовет исключение.Поскольку дело обстоит именно так (и если у пользователя не будет этих прав), лучше всего предположить, что журнал существует, и просто записать его.см .: Источник не найден, но не удалось найти некоторые или все журналы событий

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);
}
1 голос
/ 11 августа 2010

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

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

Это запишет в журнал приложения.

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

0 голосов
/ 04 июня 2015

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

        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");
        }
...