Получение “… было уже зарегистрировано …” от EventLog. CreateEventSource даже при том, что я проверяю! EventLog. SourceExists

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

lock ( eventLock )
{
    string eventLog = Constants.EventLogPL;
    string eventSrc = Constants.EventSrcPL;

    if (!EventLog.Exists(eventLog))
    {
        if (!EventLog.SourceExists(eventSrc))
        {
            try
            {
                EventLog.CreateEventSource(eventSrc, eventLog);
            }
            catch (Exception e)
            {
                System.Diagnostics.Debug.WriteLine(e.Message);
            }
        }
    }
}

Я думал бы свой вызов к !EventLog.SourceExists был бы достаточно для предотвращения моей ошибки! Я нахожусь на.NET 2010 4 и компиляция Windows 7 64 в любой ЦП.

Править: Обновленный код, чтобы заставить Constant местным жителям проверять они не изменяются, и блокировка использования, чтобы удостовериться, что только один поток может протестировать и создать. Код все еще перестал работать с той же ошибкой.

9
задан JLWarlow 22 July 2010 в 09:22
поделиться

2 ответа

Нашел проблему, покопавшись еще немного в Sysinternals' Process Monitor:

Вызываю EventLog.Exists("MyLog");

Имя журнала не найдено, как ожидалось в:

KLM\System\CurrentControlSet\services\eventlog\MyLog

Вызываю EventLog. SourceExists("MySource");

Проверяет несколько мест, имя не найдено, как ожидалось:

HKLM\System\CurrentControlSet\services\eventlog\Application\MySource
HKLM\System\CurrentControlSet\services\eventlog\HardwareEvents\MySource
HKLM\System\CurrentControlSet\services\eventlog\Internet Explorer\MySource
HKLM\System\CurrentControlSet\services\eventlog\Key Management Service\MySource
HKLM\System\CurrentControlSet\services\eventlog\Media Center\MySource
HKLM\System\CurrentControlSet\services\eventlog\ODiag\MySource
HKLM\System\CurrentControlSet\services\eventlog\OSession\MySource
HKLM\System\CurrentControlSet\services\eventlog\Security\MySource
HKLM\System\CurrentControlSet\services\eventlog\System\MySource
HKLM\System\CurrentControlSet\services\eventlog\VisualSVNServer\MySource
HKLM\System\CurrentControlSet\services\eventlog\Windows PowerShell\MySource
HKLM\System\CurrentControlSet\services\eventlog\Application\MySource
HKLM\System\CurrentControlSet\services\eventlog\HardwareEvents\MySource
HKLM\System\CurrentControlSet\services\eventlog\Internet Explorer\MySource
HKLM\System\CurrentControlSet\services\eventlog\Key Management Service\MySource
HKLM\System\CurrentControlSet\services\eventlog\Media Center\MySource
HKLM\System\CurrentControlSet\services\eventlog\ODiag\MySource
HKLM\System\CurrentControlSet\services\eventlog\OSession\MySource
HKLM\System\CurrentControlSet\services\eventlog\Security\MySource
HKLM\System\CurrentControlSet\services\eventlog\System\MySource
HKLM\System\CurrentControlSet\services\eventlog\VisualSVNServer\MySource
HKLM\System\CurrentControlSet\services\eventlog\Windows PowerShell\MySource
HKLM\System\CurrentControlSet\services\eventlog\MyLog

Однако, вызывая EventLog. CreateEventSource("MySource", "MyLog");

Находит MyLog в следующем месте реестра и ошибки:

HKLM\System\CurrentControlSet\services\eventlog\Application\MyLog

Удаление "HKLM\System\CurrentControlSet\services\eventlog\Application\MyLog" и повторный запуск исправили мою проблему!

Похоже, что .Exists не ищет во всех местах .CreateEvent!

23
ответ дан 4 December 2019 в 08:32
поделиться
//0 for false, 1 for true.
private static int usingResource = 0;

if (!EventLog.SourceExists(Constants.EventSrcPL))
{
    //0 indicates that the method is not in use.
    if (0 == Interlocked.Exchange(ref usingResource, 1))
    {
        if (!EventLog.SourceExists(Constants.EventSrcPL))
        {
            try
            {
                EventLog.CreateEventSource(Constants.EventSrcPL, Constants.EventLogPL);
            }
            catch (Exception e)
            {
                System.Diagnostics.Debug.WriteLine(e.Message);
                //Release the lock
                Interlocked.Exchange(ref usingResource, 0);
            }
        }
    }
}
else
{
    usingResource = 0;
}

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

Отредактировано : внесены изменения, учитывающие отложенное создание EventSource .

2
ответ дан 4 December 2019 в 08:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: