2009-12-14 65 views
23

我有一些像这样的代码:EventLog.CreateEventSource不是创建一个自定义日志

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

现在,除非我失去了一些东西看了MSDN,这一点应引起一个新的日志“myAppLog”要创建在事件查看器中,并且应将条目添加到具有源名称“myApp”的新日志中。但是,我无法获得要创建的新日志。这始终只是将错误日志消息写入应用程序日志,并且源'myApp' - 'myAppLog'无处可见。我究竟做错了什么?我以管理员身份登录。

回答

38

在写入标准应用程序日志时,您是否可能已经使用源“myApp”?如果是这样,根据MSDN:

如果源已经被映射到 日志,而你是重新映射到一个新的日志, 必须重新启动计算机以使 更改生效。

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

+1

这基本上是我的问题。 Windows事件日志有点棘手,因为如果这是您第一次写入新的自定义日志,直到重新启动计算机,它可能无法正常工作。我让它创建了日志,但它仍然将消息写入新的自定义日志和事件查看器中的应用程序日志,直到我重新启动机器。之后,新消息刚刚记录到我的新自定义日志中。谢谢! – Jez 2009-12-14 15:49:55

+0

经过一段时间的调试,我重新启动。这工作! – jonas 2014-04-28 12:18:12

+0

重新启动EventViewer帮助我在Win8上的情况。 – Legends 2015-04-25 23:52:38

0

您是否在EventLog上设置了源代码?

MSDN Article

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

+0

这只适用于创建EventLog实例的情况。当我使用静态WriteEntry方法时,源作为第一个字符串参数传递。 – Jez 2009-12-14 14:54:05

4

您可能忘记在EventLog上设置Source属性。

它应该是这个样子:

 if(!EventLog.SourceExists("MySource")) 
     { 
      EventLog.CreateEventSource("MySource", "MyNewLog"); 
     } 

     EventLog myLog = new EventLog(); 
     myLog.Source = "MySource"; 

     myLog.WriteEntry("Writing to event log."); 

这里的MSDN article以供参考。

+0

与另一个答案一样的错误。 :-)我没有使用EventLog的实例;我正在使用静态WriteEntry方法,所以这不适用。 – Jez 2009-12-14 15:23:07

+1

@Jez如果你正在创建EventSource,你必须记住构建EventSource有一个延迟,所以它不会立即可用。如果你执行你的程序两次,它是否开始写入正确的源? – Joseph 2009-12-14 15:30:39

5

我刚才写一些代码来帮我出这一点。源注册在另一个日志问题,我遇到过,不想手动必须从日志中删除源。我决定要做的是检查源是否存在,是否检查链接到正确的日志,是否不删除源,现在它不存在或者它从未创建过Log品牌新。

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

希望这有助于:)

+0

这是一个有点CheckSourceExists沉重...如果那是一直在做这个噩梦。为什么不在执行开始时检查一次,并将其留在那里? – CokoBWare 2014-08-11 14:20:39

+0

是的,你是那里,我想我最终重新考虑到这一点是每个网站实用程序更多的运行一次。管理员权限(或特定事件日志权限)对创建源的要求也是一个激励因素。 – PJUK 2014-09-19 10:59:43

0

如果检查在其他的答案的所有建议,然后阅读下列

MSDN

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

确保前8个字符是唯一的。

0

基本上,最简单的解决方案是你必须关闭你的visual studio并以管理员模式运行。然后,您将能够解决此错误