事件创建无效

时间:2013-04-19 21:27:54

标签: c# .net

我有源“Source401”用于日志“Log401”。我需要将此源用于“Log402”日志并删除日志“Log401”。 (如果我们可以将“Log401”重命名为“Log402”,那也很好。但所有这些都需要以编程方式完成)

使用下面的代码,我收到以下异常。实现它的最佳方法是什么?

  

源Source401已存在于本地计算机上。

注意:当我删除旧日志时,它工作正常。但事件并没有被创造出来。

更新

来自MSDN

  

操作系统将事件日志存储为文件。使用EventLogInstaller或CreateEventSource创建新事件日志时,关联文件存储在指定计算机上的%SystemRoot%\ System32 \ Config目录中。通过使用“.evt”文件扩展名附加Log属性的前8个字符来设置文件名。

     

源在本地计算机上必须是唯一的;新源名称与现有源名称或现有事件日志名称不匹配。每个源一次只能写入一个事件日志;但是,您的应用程序可以使用多个源写入多个事件日志。

CODE

  string source = "Source401";
  string logName = "Log402";
  string oldLogName = "Log401";
  string eventName = "Sample Event";
  string machineName = ".";


            if (!EventLog.Exists(logName, machineName))
            {
                ////Delete old log
                //if (EventLog.Exists(oldLogName, machineName))
                //{
                //    EventLog.Delete(oldLogName, machineName);
                //}



                //Create Source for the Log
                EventLog.CreateEventSource(source, logName, machineName);

                //Create Event
                EventLog eventLog = new EventLog(logName, machineName, source);
                eventLog.WriteEntry(eventName);
                try
                {
                    eventLog.WriteEntry(eventName, EventLogEntryType.Warning, 234, (short)3);
                }
                catch (Exception exception)
                {
                    int x = 0;
                }

1 个答案:

答案 0 :(得分:2)

例外是告诉你完全问题是什么。名为“Source401”的事件源已存在。您正在删除旧的事件日志“Log401”,但您没有删除事件源。

正如the documentation所说:

  

操作系统将事件日志存储为文件。使用EventLogInstaller或CreateEventSource创建新事件日志时,关联文件存储在指定计算机上的%SystemRoot%\ System32 \ Config目录中。通过使用“.evt”文件扩展名附加Log属性的前8个字符来设置文件名。

     

源在本地计算机上必须是唯一的;新源名称与现有源名称或现有事件日志名称不匹配。每个源一次只能写入一个事件日志;

此外,这个小金块:

  

如果源已映射到日志并将其重新映射到新日志,则必须重新启动计算机才能使更改生效。

此外,您可能还想从文档中考虑这一点:

  

在安装应用程序期间创建新的事件源。这允许操作系统有时间刷新其已注册事件源列表及其配置。如果操作系统没有刷新其事件源列表,并且您尝试使用新源写入事件,则写入操作将失败

最后,您调用的CreateEventSource方法已被标记为过时,并且自.NET 2.0开始。通常有一个很好的理由将方法标记为过时的。你应该打电话给CreateEventSource(EventSourceCreationData)

我认为您需要重新考虑使用事件日志的方式。您的应用程序不应该以这种方式创建和删除日志。这不是他们打算如何使用的。