在C#中写入事件日志 - 写入应用程序日志时是否需要使用EventLog.CreateEventSource?

9
当我使用以下代码写入应用程序事件日志时,一切都正常:
EventLog log = new EventLog();
log.Source = "Application";
log.WriteEntry("test message", EventLogEntryType.Error);

当我使用来自MSDN和其他博客的代码时,我遇到了安全错误(我猜测是因为CreateEventSource引起的)。
string sSource = "MyWebService";
string sLog = "myApplication";
string sMsg = errorMessage;

if (!EventLog.SourceExists(sSource))
   EventLog.CreateEventSource(sSource, sLog);

 EventLog.WriteEntry(sSource, sMsg, EventLogEntryType.Error);  

那么,如果我只需要写入默认的应用程序日志,我是否需要检查源是否存在?

写入EventViewer的正确方式是什么?

6个回答

7

CreateEventSource方法在事件日志中创建一个新的源,这样您就可以将应用程序的日志写入应用程序自己的组中,而不是写入通用的“Application”组。

如果使用的用户没有创建事件源的权限,则可能会出现错误,请尝试以管理员身份运行程序(如果您正在使用Vista / 7操作系统)。

在事件查看器中记录日志的适当方式取决于您的需求。如果您的应用程序生成大量日志消息并且希望将此日志分组到特定的应用程序容器中,可能最好创建一个特定于应用程序的日志事件源并将日志写入其中。如果您的应用程序生成少量日志消息并且没有必要将它们分组在一起,则可以使用通用的“Application”日志事件源...


1
非常好,谢谢!我只是需要确认一下。我不需要创建单独的源/日志。实际上我想要写入应用程序日志。 - sarsnake
2
还有一个问题:当我写入通用应用程序源时,在事件查看器中查看它时会出现以下消息:“无法找到事件(0)的源(应用程序)的描述。本地计算机可能没有必要的注册表信息或消息DLL文件来显示来自远程计算机的消息”...然后显示我的自定义消息。我想知道是否有可能不设置源而不显示这个长默认消息。 - sarsnake
这是因为您的监控计算机没有错误消息的引用。将远程机器事件日志导出为基于文本的CSV文件,您将获得来自远程机器的所有信息(包括其他人安装的所有应用程序的错误)。 - Peter

2

2
谢谢,但这并没有回答所提出的问题。 - sarsnake

2
您需要管理员权限才能创建事件源。在第一个中,您未使用自定义源。

1

直接的WriteEntry会写入默认的Application源。如果您想创建自己的自定义源以更轻松地查找事件查看器中的任何日志条目,则可以使用SourceExists和CreateEventSource。

是的,正如其他人所提到的,您需要有权限创建客户事件源。


0

您需要管理员权限才能运行应用程序。

您可以通过进入应用程序的调试文件夹,右键单击 .exe 文件并以管理员身份运行来运行应用程序

或者

您可以以管理员身份运行 Visual Studio


-1

您不需要创建事件源。对于生成语言无关或具有替换的事件,它可能是一个巨大的优势,但对于.NET程序来说,这是可选的(BCL提供默认事件源)。


当日志为空时,写入事件日志前未设置源属性,因此会出现“未设置源属性”错误。因此,它不是可选的。 - Juan Zamudio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接