Запись сообщений в журнал событий приложений

У меня возникла проблема с записью событий в журнал событий 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 + "]";
        }
    }
}

person Michael Sabin    schedule 21.02.2013    source источник
comment
Что такое Tracer.Misc.Error ? полный исходный образец?   -  person Kiquenet    schedule 04.06.2014


Ответы (2)


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

т.е. переход от «Мой источник событий» к «MyEventSource»

person Michael Sabin    schedule 22.02.2013
comment
Это также решило мою проблему. Нигде не указано очевидно, что источники событий не могут иметь пробелы, и даже некоторые источники событий в средстве просмотра событий имеют пробелы в своих именах ... очень озадачивает! - person dreamlax; 21.02.2015

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

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

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

К мероприятию была приложена следующая информация:

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

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

person Nikhil Setty    schedule 22.05.2015