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

时间:2010-07-22 08:47:37

标签: c# .net .net-4.0 event-log

我的以下代码失败,“...已经在本地计算机上注册为源”,即使我先做检查:

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 .NET 4和Windows 7 64编译到任何CPU。

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

2 个答案:

答案 0 :(得分:22)

在深入了解Sysinternals' Process Monitor之后发现问题:

致电EventLog.Exists("MyLog");

未找到日志名称,如预期的那样:

KLM \系统\ CurrentControlSet \服务\事件日志\ MyLog

致电EventLog.SourceExists("MySource");

检查多个地方,名称未按预期找到:

HKLM \系统\ CurrentControlSet \服务\事件日志\应用程序\ MYSOURCE
HKLM \系统\ CurrentControlSet \服务\事件日志\ 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 \系统\ CurrentControlSet \服务\事件日志\ ODIAG \ MYSOURCE
HKLM \系统\ CurrentControlSet \服务\事件日志\ OSession \ MYSOURCE
HKLM \系统\ CurrentControlSet \服务\事件日志\安全\ MYSOURCE
HKLM \系统\ CurrentControlSet \服务\事件日志\ SYSTEM \ MYSOURCE
HKLM \系统\ CurrentControlSet \服务\事件日志\ VisualSVNServer \ MYSOURCE
HKLM \ System \ CurrentControlSet \ services \ eventlog \ Windows PowerShell \ MySource
HKLM \系统\ CurrentControlSet \服务\事件日志\应用程序\ MYSOURCE
HKLM \系统\ CurrentControlSet \服务\事件日志\ 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 \系统\ CurrentControlSet \服务\事件日志\ ODIAG \ MYSOURCE
HKLM \系统\ CurrentControlSet \服务\事件日志\ OSession \ MYSOURCE
HKLM \系统\ CurrentControlSet \服务\事件日志\安全\ MYSOURCE
HKLM \系统\ CurrentControlSet \服务\事件日志\ SYSTEM \ MYSOURCE
HKLM \系统\ CurrentControlSet \服务\事件日志\ VisualSVNServer \ MYSOURCE
HKLM \ System \ CurrentControlSet \ services \ eventlog \ Windows PowerShell \ MySource
HKLM \系统\ CurrentControlSet \服务\事件日志\ MyLog

但是,请致电EventLog.CreateEventSource("MySource", "MyLog");

在以下注册表位置和错误中查找MyLog:

HKLM \系统\ CurrentControlSet \服务\事件日志\应用程序\ MyLog

删除“HKLM \ System \ CurrentControlSet \ services \ eventlog \ Application \ MyLog”并重新运行修复了我的问题!

看起来.Exists并未查看.CreateEvent所有位置!

答案 1 :(得分:2)

//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的延迟创建。

相关问题