2009-12-14 4 views
23

У меня есть некоторый код, как это:EventLog.CreateEventSource не создает пользовательский журнал

EventLog.CreateEventSource("myApp", "myAppLog"); 
EventLog.WriteEntry("myApp", "Test log message", EventLogEntryType.Error); 

Теперь, если я не хватаю чего-то, прочитав MSDN, это должно вызвать новый журнал «myAppLog» будет созданы в средстве просмотра событий, и запись должна быть добавлена ​​в этот новый журнал с именем источника 'myApp'. Но я не могу создать новый журнал. Это всегда просто записывает сообщение журнала ошибок в журнал приложений, а источник «myApp» - «myAppLog» нигде не видно. Что я делаю не так? Я зарегистрирован как администратор.

ответ

38

Возможно ли, что вы уже использовали источник «myApp» при записи в стандартный журнал приложений? Если это так, согласно MSDN:

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

http://msdn.microsoft.com/en-us/library/2awhba7a.aspx (примерно на полпути вниз страницы)

+1

Это была моя проблема. Журнал событий Windows немного виноват в том, что он может работать неправильно, если это первый раз, когда вы пишете новый журнал, пока вы не перезапустите компьютер. Я получил его создание журнала, но он все еще записывал сообщения как в этот новый пользовательский журнал, так и в журнал приложений в средстве просмотра событий, пока я не перезапустил машину. После этого новые сообщения только что вошли в мой новый журнал. Благодаря! – Jez

+0

После некоторого времени отладки я перезапустил. Это сработало! – jonas

+0

Перезапуск EventViewer помог мне в моем случае на Win8. – Legends

0

Вы установили источник в своем EventLog?

От MSDN Article.

Перед записью записи в журнал необходимо установить свойство Source на экземпляр компонента EventLog. Когда ваш компонент записывает запись, система автоматически проверяет, зарегистрирован ли указанный вами источник в журнале событий, к которому записывается компонент, и при необходимости вызывает CreateEventSource. В общем случае создайте новый источник событий во время установки вашего приложения. Это позволяет время для операционной системы обновлять список зарегистрированных источников событий и их конфигурацию. Если операционная система не обновила список источников событий и вы попытаетесь записать событие с новым источником, операция записи завершится с ошибкой. Если создание источника во время установки не является опцией, попробуйте создать источник задолго до первой операции записи, возможно, во время инициализации вашего приложения. Если вы выберете этот подход, убедитесь, что ваш код инициализации работает с правами администратора на компьютере. Эти права необходимы для создания новых источников событий.

+0

Это применимо только в том случае, если вы создаете экземпляр EventLog. Поскольку я использую статический метод WriteEntry, источник передается как первый строковый аргумент. – Jez

4

Возможно, вы забыли установить свойство Source в своем EventLog.

Это должно выглядеть примерно так:

 if(!EventLog.SourceExists("MySource")) 
     { 
      EventLog.CreateEventSource("MySource", "MyNewLog"); 
     } 

     EventLog myLog = new EventLog(); 
     myLog.Source = "MySource"; 

     myLog.WriteEntry("Writing to event log."); 

Вот MSDN article для справки.

+0

Та же ошибка, что и другой ответ. :-) Я не использую экземпляр EventLog; Я использую статический метод WriteEntry, поэтому это не применяется. – Jez

+1

@Jez, если вы создаете EventSource на лету, вам нужно иметь в виду, что в создании EventSource существует латентность, поэтому он не станет сразу доступным. Если вы выполняете программу дважды, начинает ли она записываться в правильный источник? – Joseph

5

Я просто написал небольшой код, чтобы помочь мне в этом. источник, зарегистрированный в другой проблеме журнала, с которой я столкнулся, и не хочу вручную удалять источники из журналов. То, что я решил сделать, это проверить, существует ли источник, если он проверяет, что он связан с правильным журналом, если он не удаляет исходный код, теперь, когда он не существует, или f никогда не создавал новый Log Log ,

protected const string EventLogName = "MyLog"; 

private static bool CheckSourceExists(string source) { 
    if (EventLog.SourceExists(source)) { 
    EventLog evLog = new EventLog {Source = source}; 
    if (evLog.Log != EventLogName) { 
     EventLog.DeleteEventSource(source); 
    } 
    } 

    if (!EventLog.SourceExists(source)) { 
    EventLog.CreateEventSource(source, EventLogName); 
    EventLog.WriteEntry(source, String.Format("Event Log Created '{0}'/'{1}'", EventLogName, source), EventLogEntryType.Information); 
    } 

    return EventLog.SourceExists(source); 
} 

public static void WriteEventToMyLog(string source, string text, EventLogEntryType type) {  
    if (CheckSourceExists(source)) {   
     EventLog.WriteEntry(source, text, type);   
    } 
} 

Надеется, что это помогает :)

+0

Это немного CheckSourceExists тяжелый ... был бы кошмаром, если бы это делало это все время. Почему бы не проверить его один раз в начале выполнения и оставить его на этом? – CokoBWare

+0

Да, вы прямо здесь, я думаю, что в итоге я перефразировал это во что-то, что было немного больше, чем один раз для одной утилиты сайта. Требование для прав администратора (или определенных разрешений журнала событий) для создания источников также было мотиватором. – PJUK

0

Если вы проверили все предложения в других ответах, то прочитайте следующую

От MSDN

операционной система хранит журналы событий в виде файлов , Когда вы используете EventLogInstaller или CreateEventSource для создания нового журнала событий, соответствующий файл хранится в каталоге% SystemRoot% \ System32 \ Config на указанном компьютере. Имя файла устанавливается путем добавления первых 8 символов свойства Log с расширением имени файла .evt.

Убедитесь, что первые 8 символов являются уникальными.

0

В основном, самое простое решение - вам нужно закрыть свою визуальную студию и запустить ее как режим администратора. Затем вы сможете устранить эту ошибку.

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