2015-01-15 4 views
3

Я много лет борется с журналом событий Windows с непоследовательным поведением во время тестирования log4net EventLogAppender, и я понял, что работает код log4net, но мой журнал событий Windows был неразумным.Создание ранее удаленного источника в журнале событий не работает

Система

  • ОС: Windows 8.1
  • C#: .Net 4.5, построенный на x64

Создание случай ошибки

  • C#: Создание Source1 в TestLog1
  • C#: Запись в журнал (работ)
  • Powershell: Удаление журнала с помощью PowerShell
  • C# Создать source1 в TestLog2 (Different журнал)
  • C# запись в журнал < = Это не показывает записи журнала TestLog2!

Я сделал полное руководство шаг за шагом, чтобы воссоздать проблему:

1: Создание нового источника в новом журнале и написать к нему

Код, выполняемый:

EventLog.CreateEventSource(source: "TestSource1", logName: "TestLog1"); 
EventLog myLog = new EventLog(); 
myLog.Source = "TestSource1"; 
myLog.WriteEntry("This is a message"); 

Список журналов с помощью PowerShell-команды:

Get-EventLog -LogName * 

Это будет правильно список всех журналов, включая TestLog1, содержащий 1 запись в журнале. Я также могу получить записи журнала с помощью этой команды Powershell:

GetEventLog -LogName "TestLog1" 

Это показывает мне одно сообщение журнала в журнале.

2: Удаление журнала событий с помощью Powershell

команды Powershell:

Remove-EventLog -LogName "TestLog1" 

каталога всех журналов теперь показывает, что журнал действительно был удален.Команда Powershell снова:

Get-EventLog -LogName * 

3: Создать источник снова, но в другом журнале этот раз

Код, выполняемый:

EventLog.CreateEventSource(source: "TestSource1", logName: "TestLog2"); // New log name 
EventLog myLog = new EventLog(); 
myLog.Source = "TestSource1"; 
myLog.WriteEntry("This is a message"); 

Результат:

  • Журнал появляется в powershell, когда Список всех журналов
  • Журнал не содержит какую-либо запись
  • Использования Get-EventLog «TestLog2» кидает и исключение, даже если он появляется в логе-списке
  • Удаления журнала в PowerShell с помощью удаления-EventLog -logName " TestLog2 "как-то все еще работает.

Похоже, что в некоторых случаях журналы существуют, но в других это не так.

A: Это известная ошибка или что не так с моим сценарием?

B: Как я могу очистить свой существующий беспорядок, если источники как-то все еще существуют, указывая на старый журнал? (Если тот случай, то есть)

EDIT: Я даже пробовал следующий C# код для удаления источника первым, а затем журнал, но результат тот же:

var source = "TestSource6"; 
var logName1 = "Testlog5"; 
var logName2 = "Testlog6"; 

EventLog.CreateEventSource(source: source, logName: logName1); 

new EventLog() { Source = source }.WriteEntry("This is a message in log " + logName1); 

EventLog.DeleteEventSource(source:source); 
EventLog.Delete(logName:logName1); 

EventLog.CreateEventSource(source: source, logName: logName2); 
new EventLog() { Source = source }.WriteEntry("This is a message" + logName2); 

ответ

4

К сожалению, вы не может перерегистрировать источник событий «спина к спине». Это одна из причин, по которой установщики часто просят перезагрузить компьютер.

Из MSDN:

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

EventLog.CreateEventSource Method (String, String)

Для фиксации этого вопроса, я рекомендовал бы не удаление источника событий, если продукт не будет удален. Просто прекратите использовать Log1 и начните использовать Log2, не удаляя и не воссоздавая. Когда вы идете использовать любой журнал, вы могли бы использовать что-то похожее на это:

if (!EventLog.SourceExists(source, log)) 
{ 
    EventLog.CreateSource(source, log) 
} 

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

+0

Это, похоже, решает проблему. Спасибо, что нашли время ответить! :) –

Смежные вопросы