Как выполнить запись в пользовательский журнал событий Windows?
-
03-07-2019 - |
Вопрос
Я пытаюсь настроить базовую регистрацию в журнале событий Windows в .net через System.Diagnostics.EventLog
, но я не вижу, чтобы какие-либо события действительно записывались в журнал.Рассмотрим следующий код:
// Elsewhere in the class
private static readonly string EventLogName = "LogName";
private static readonly string EventLogSource = "AppName";
// In the only function that does something
if (!EventLog.Exists(EventLogName))
{
EventLog.CreateEventSource(EventLogSource, EventLogName);
return;
}
else
{
Trace.TraceInformation("Attempting log");
// This doesn't write anything
EventLog.WriteEntry(EventLogSource,
"StaticWriteEntry",
EventLogEntryType.Error);
// Neither does this
using (var log = new EventLog())
{
log.Log = EventLogName;
log.Source = EventLogSource;
log.WriteEntry("WriteEntry?", EventLogEntryType.Error);
}
}
return;
В первый раз я создаю журнал и выхожу из приложения согласно образцу MSDN.Разумеется, создание журнала в конечном итоге войдет в настройку.Последующие запуски пытаются записать сообщение в созданный журнал событий.
Никаких исключений не создается.Кажется, журнал успешно создан (я могу открыть его в средстве просмотра событий Windows).В журнал безопасности не записывается ничего значимого.
Никакие сообщения не регистрируются ни через WriteEntry()
.Они также не помещаются в журнал приложений из-за несовпадающего имени.В данном конкретном случае я работаю на Server2008 под учетной записью администратора с отключенным UAC.(Это небольшая часть более крупного устаревшего продукта, требующего неудачной среды.) Что я делаю не так?
(Я делаю это, потому что хочу использовать EventLogTraceListener
в моем app.config, и он ничего не записывал, так что это часть устранения этой проблемы.)
Решение
Проблема, похоже, связана с именем источника.В частности, если я изменю имя источника, я смогу успешно писать.Это связано со следующей строкой в нижней части EventLog.Source
документы:
Если источник уже сопоставлен с журналом и вы повторно сопоставляете его с новым журналом, необходимо перезагрузить компьютер, чтобы изменения вступили в силу.
В ходе разработки имя журнала и источник журнала создавались и уничтожались пару раз, и я, возможно, изменил имя журнала, не меняя имени источника.
Предположим, что мой первоначальный источник и журнал были "OldSource"
и "OldLog"
.Я определил, что это может быть источником проблемы, изменив код попытки записи в "NewSource"
и "NewLog"
.Когда я изменил оба, я успешно создал и написал "NewLog"
.Когда я попытался написать "NewLog"
создав его с "OldSource"
, однако это не удалось.
Я подтвердил, что это проблема, перезагрузив мою систему разработки и запустив тот же код (с "NewLog"
и "OldSource"
) и это сработало.
Думаю, это тот самый случай, когда перезагрузка действительно помогла!:)