【问题标题】:Writing to event log in C# - do I need to use EventLog.CreateEventSource when writing to Application log?在 C# 中写入事件日志 - 写入应用程序日志时是否需要使用 EventLog.CreateEventSource?
【发布时间】:2011-12-19 03:25:51
【问题描述】:

当我使用以下代码写入应用程序事件日志时,一切正常:

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

【问题讨论】:

    标签: c# event-viewer event-log


    【解决方案1】:

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

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

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

    【讨论】:

    • 太好了,谢谢!我只需要确认一下。我不需要创建单独的源/日志。我确实想写入应用程序日志。
    • 还有一个问题:当我写入通用应用程序源时,我在事件查看器中查看它时收到以下消息:“Event(0) 的描述是 Source(Application) 不能找到。本地计算机可能没有必要的注册表信息或消息 DLL 文件来显示来自远程计算机的消息“....然后显示我的自定义消息。我想知道是否可以在不设置源的情况下不显示这条长长的默认消息。
    • 这是因为您的监控计算机没有对错误消息的引用,将远程计算机事件日志导出到基于文本的 CSV 文件,您可以从远程计算机获取所有信息(包括其他人拥有的所有应用程序的错误)已安装)。
    【解决方案2】:

    我建议你尝试 log4net,以防你也想写入不同的源(smtp、文件等)

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

    对于网络应用:

    一般用途:

    winforms/windows 服务的类似解决方案。

    【讨论】:

    • 谢谢,但这并不能回答所提出的问题。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

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

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

        您以管理员身份运行 Visual Studio

        【讨论】:

          【解决方案6】:

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

          【讨论】:

          • 当 Log 为空时,您会收到错误“Source property was not set before writing to the event log”,所以不,这不是可选的。
          猜你喜欢
          • 1970-01-01
          • 2014-11-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多