代码之家  ›  专栏  ›  技术社区  ›  Jez

eventlog.createEventSource未创建自定义日志

  •  24
  • Jez  · 技术社区  · 15 年前

    我有一些这样的代码:

    EventLog.CreateEventSource("myApp", "myAppLog");
    EventLog.WriteEntry("myApp", "Test log message", EventLogEntryType.Error);
    

    现在,除非我错过了读取msdn的内容,否则这将导致在事件查看器中创建一个新的日志“myapp log”,并将一个条目添加到源名称为“myapp”的新日志中。但是,我无法创建新的日志。这通常只会将错误日志消息写入应用程序日志,而源“myapp”-“myapp log”则不可见。我做错什么了?我以管理员身份登录。

    6 回复  |  直到 7 年前
        1
  •  39
  •   Chris Haas    15 年前

    是否可能在写入标准应用程序日志时已使用源“myapp”?如果是,根据msdn:

    如果源已映射到 一个日志,然后重新映射到一个新的日志, 您必须重新启动计算机 更改生效。

    http://msdn.microsoft.com/en-us/library/2awhba7a.aspx (大约在页面的一半处)

        2
  •  5
  •   gkrogers    13 年前

    我刚刚写了一些代码来帮助我摆脱这种困境。在我遇到的另一个日志问题中注册的源,不希望手动从日志中删除源。我决定做的是检查源是否存在,如果它确实检查它是否链接到正确的日志,如果它没有删除源,现在它不存在,或者它从未创建全新的日志。

    protected const string EventLogName = "MyLog";
    
    private static bool CheckSourceExists(string source) {
      if (EventLog.SourceExists(source)) {
        EventLog evLog = new EventLog {Source = source};
        if (evLog.Log != EventLogName) {
          EventLog.DeleteEventSource(source);
        }
      }
    
      if (!EventLog.SourceExists(source)) {
        EventLog.CreateEventSource(source, EventLogName);
        EventLog.WriteEntry(source, String.Format("Event Log Created '{0}'/'{1}'", EventLogName, source), EventLogEntryType.Information);
      }
    
      return EventLog.SourceExists(source);
    }
    
    public static void WriteEventToMyLog(string source, string text, EventLogEntryType type) {      
      if (CheckSourceExists(source)) {          
          EventLog.WriteEntry(source, text, type);          
      }
    }
    

    希望有帮助:)

        3
  •  4
  •   Joseph    15 年前

    您可能忘记在事件日志上设置source属性。

    它应该是这样的:

            if(!EventLog.SourceExists("MySource"))
            {
                EventLog.CreateEventSource("MySource", "MyNewLog");
            }
    
            EventLog myLog = new EventLog();
            myLog.Source = "MySource";
    
            myLog.WriteEntry("Writing to event log.");
    

    这里是 MSDN article 供参考。

        4
  •  0
  •   David Basarab    15 年前

    你在事件日志上设置了源代码吗?

    MSDN Article .

    必须先在事件日志组件实例上设置source属性,然后才能将条目写入日志。当您的组件写入一个条目时,系统会自动检查您指定的源是否在组件正在写入的事件日志中注册,并在需要时调用CreateEventSource。通常,在安装应用程序期间创建新的事件源。这使操作系统有时间刷新已注册事件源及其配置的列表。如果操作系统没有刷新其事件源列表,并且您试图用新的源写入事件,则写入操作将失败。如果在安装期间创建源不是一个选项,那么在第一次写操作之前,可能是在应用程序初始化期间,尝试创建源。如果选择此方法,请确保初始化代码在计算机上以管理员权限运行。创建新事件源需要这些权限。

        5
  •  0
  •   LCJ    11 年前

    如果您已在其他答案中检查了所有建议,请阅读以下内容

    MSDN

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

    确保 前8个字符 是独一无二的。

        6
  •  0
  •   Himanshu Soni    7 年前

    基本上,最简单的解决方案是关闭Visual Studio并以管理员模式运行。那么,您就可以解决这个错误了