2013-02-21 5 views
1

У меня возникла проблема с записью событий в журнал событий Windows. Я просмотрел сообщения, и я думаю, что делаю это правильно, но у меня по-прежнему появляется следующая ошибка в средстве просмотра событий:Запись сообщений в журнал событий приложений

Ресурс сообщения присутствует, но сообщение не найдено в таблице строк/сообщений

Есть ли у кого-нибудь идеи о том, что мне не хватает?

Я имею источник событий, созданный в инсталляторе WIX:

<Fragment> 
    <PropertyRef Id="NETFRAMEWORK35"/> 
    <PropertyRef Id="NETFRAMEWORK20"/> 
    <PropertyRef Id="NETFRAMEWORK20INSTALLROOTDIR"/> 
    <PropertyRef Id="NETFRAMEWORK20INSTALLROOTDIR64" /> 

    <Component Id='EventSource' 
       Directory='INSTALLDIR' 
       Guid='F382AAC5-F7C5-46A4-95CF-EA7724DXXXXX' > 
     <Condition>ALLUSERS</Condition> 
     <?if $(var.Platform) = x64 ?> 
      <util:EventSource Log='Application' 
        Name='MySource' 
        EventMessageFile='[NETFRAMEWORK20INSTALLROOTDIR64]EventLogMessages.dll' 
        KeyPath='yes' /> 
     <?else ?> 
      <util:EventSource Log='Application' 
        Name='MySource' 
        EventMessageFile='[NETFRAMEWORK20INSTALLROOTDIR]EventLogMessages.dll' 
        KeyPath='yes' /> 
     <?endif ?> 
    </Component> 
</Fragment> 

А вот мой C# код, где я пишу в журнал событий:

public class Log 
{ 
    private const string EventSource = "MySource"; 
    private const string EventLog = "Application"; 
    private static EventLog _logger = null; 

    private static void InitLogger() 
    { 
     if (!System.Diagnostics.EventLog.SourceExists(EventSource)) 
     { 
      System.Diagnostics.EventLog.CreateEventSource(EventSource, EventLog); 
     } 
     _logger = new EventLog() { Source = EventSource, Log = EventLog }; 
    } 

    public static void Write(EventLogEntryType entryType, string format, params object[] args) 
    { 
     string entry = _Format(format, args); 

     try 
     { 
      if (_logger == null) 
       InitLogger(); 
      _logger.WriteEntry(entry, entryType, 1); 
     } 
     catch (Exception ex) 
     { 
      Tracer.Misc.Error("Could not write to event log: {0}", entry); 
     } 

    } 

    private static string _Format(string format, object[] args) 
    { 
     if ((args == null) || (args.Length == 0)) 
      return format; 

     try 
     { 
      return String.Format(format, args); 
     } 
     catch (Exception e) 
     { 
      return format + " [Format Exception:" + e.Message + "]"; 
     } 
    } 
} 
+0

Что такое Tracer .Misc.Error? полный образец источника? – Kiquenet

ответ

3

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

I.E. переход от «My Event-Source» к «My Event-Source» в «MyEventSource»

+2

Это также зафиксировало мою проблему. Нигде не указано, что источники событий не могут иметь пробелы, и даже некоторые источники событий в средстве просмотра событий имеют пробелы в своих именах ... очень загадочно! – dreamlax

0

Кроме того, источник событий также не может быть «Приложением», если вы регистрируетесь в «Приложении» (только для FYI, для людей, выясняющих регистрацию событий, поскольку я был пытаюсь сейчас, не ответ). Он предоставит данные каротажа следующие:

Описание события ID 101 из источника Приложение не может быть найдено. Либо компонент, который повышает это событие, не установлен на на вашем локальном компьютере, или установка повреждена. Вы можете установить или восстановить компонент на локальном компьютере.

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

Следующая информация была включена с событием:

пример журнала сообщение

ресурс сообщений присутствуют, но сообщение не найден в таблице строки/сообщения

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