2011-10-31 71 views
8

当我使用下面的代码写入应用程序事件日志中,一切工作正常:在C#中写入事件日志 - 写入应用程序日志时是否需要使用EventLog.CreateEventSource?

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的正确方法?

回答

7

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

也许你得到一个错误,因为你用来创建事件源的用户没有创建它的权限,如果你在Vista/7操作系统下,试着以管理员身份运行你的程序。

登录事件查看器的正确方法取决于您的需要,如果您的应用程序生成大量日志记录消息并且您希望将此日志分组到特定于应用程序的容器中,那么最好创建特定于应用程序的日志事件源并在其中写入日志,而不是如果您的应用程序生成很少的日志消息,并且不需要将它们组合在一起,则可以使用通用Application日志事件源...

+1

太好了,谢谢!我只是需要确认。我不需要创建一个单独的源/日志。我其实确实想写入应用程序日志。 – sarsnake

+2

还有一个问题:当我写入通用应用程序源代码时,在事件查看器中查看时收到以下消息:“Event(0)的描述是Source(应用程序)无法找到。本地计算机可能不具有必要的注册表信息或消息DLL文件以显示来自远程计算机的消息“....然后显示我的自定义消息。我想知道是否有可能不显示这个长的默认消息w/o设置源。 – sarsnake

+0

这是因为您的监控计算机没有引用错误消息,将远程计算机事件日志导出为基于文本的CSV文件,并从远程计算机获取所有信息(包括其他人已安装的所有应用程序的错误)。 – user3800527

2

我建议你试试log4net的,如果你想写信给不同的来源,以及(SMTP,文件等)

http://logging.apache.org/log4net/release/config-examples.html#eventlogappender

对于Web应用程序:

一般用途:

为的WinForms /窗口服务类似的解决方案。

+2

谢谢,但这并没有回答问题。 – sarsnake

-1

您不需要创建一个事件源。至少对于.NET程序(BCL提供默认事件源),生成独立于语言或具有替换的事件可以是一个很大的优势,但它是可选的。

+0

当Log为空时,您收到错误“源属性未在写入事件日志之前设置”,因此不,它不是可选的。 –

2

您需要拥有管理员权限才能创建事件源。在第一个你没有使用自定义源。

1

WriteEntry将直接转到默认的应用程序源。 SourceExists和CreateEventSource是如果你想创建自己的自定义源,这将更容易找到事件查看器中的任何日志条目。

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

0

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

要么你可以在你的.exe文件运行由 您的应用程序进入你的应用程序,然后右键单击的debug文件夹和管理员身份运行

您运行Visual Studio作为管理员