代码之家  ›  专栏  ›  技术社区  ›  John Warlow

正在从EventLog.CreateEventSource接收“…已注册…”,即使我正在检查!EventLog.SourceExists存在

  •  9
  • John Warlow  · 技术社区  · 16 年前

    我的以下代码失败,出现“…已在本地计算机上注册为源代码”,即使我先进行检查:

    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 足以阻止我的错误! 我在2010.NET4和Windows764上编译到任何CPU。

    更新了代码,以获取本地常量,以检查它们是否不变,并使用锁定确保只有一个线程可以测试和创建。代码仍然失败,并出现相同的错误。

    2 回复  |  直到 16 年前
        1
  •  23
  •   John Warlow    16 年前

    在深入调查后发现问题 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\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\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”并重新运行修复了我的问题!

    .Exists 不要到处看 .CreateEvent 做!

        2
  •  2
  •   Jaroslav Jandek    16 年前
    //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 .

    推荐文章