Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 事件创建不起作用_C#_.net - Fatal编程技术网

C# 事件创建不起作用

C# 事件创建不起作用,c#,.net,C#,.net,我将源“Source401”用于日志“Log401”。我需要为“Log402”日志使用此源,并删除日志“Log401”。(如果我们可以将“Log401”重命名为“Log402”,也可以。但所有这些都需要以编程方式完成) 使用下面的代码,我得到以下异常。实现这一目标的最佳方式是什么 本地计算机上已存在源401 注意:当我删除旧日志时,它工作正常。但这些事件并没有被创造出来 更新 string source = "Source401"; string logName =

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

使用下面的代码,我得到以下异常。实现这一目标的最佳方式是什么

本地计算机上已存在源401

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

更新

  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;
                }

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

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

代码

  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;
                }

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

正如上面所说:

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

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

还有,这个小金块:

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

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

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

最后,您正在调用的
CreateEventSource
方法被标记为已过时,并且从.NET 2.0开始就已过时。通常有很好的理由将方法标记为过时。你应该打电话来


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

我认为人们仍然可以理解你的问题。您应该使用更多神秘的名称,然后
S401
&
L401
,那么您的问题是什么?@JimMischel为什么在我取消注释注释注释注释代码时不使用日志“Log402”创建事件?虽然在这种情况下没有错误,但不会将事件添加到日志中。感谢您提供完整的答案