C# - 在 WPF 应用程序中,EventLogSession.ExportLog 方法会抛出 EventLogNotFoundException 异常。

3

我正在尝试在一个.NET Framework 4.7.2的WPF应用程序中实现一项功能,该功能允许客户将他们的本地应用程序事件日志作为诊断包的一部分导出。我编写了这个方法:

/// <summary>
/// Exports only errors from local application event log
/// </summary>
void addWindowsEventLog(String exportPath) {
    const String QUERY_ERRORS = "*[System/Level=2]";
    using (var eventLogSession = new EventLogSession()) {
        eventLogSession.ExportLog("Application", PathType.LogName, QUERY_ERRORS, exportPath);
    }
}

由于某种原因,它出现了以下异常:
System.Diagnostics.Eventing.Reader.EventLogNotFoundException
   at System.Diagnostics.Eventing.Reader.EventLogException.Throw(Int32)
   at System.Diagnostics.Eventing.Reader.NativeWrapper.EvtExportLog(System.Diagnostics.Eventing.Reader.EventLogHandle, System.String, System.String, System.String, Int32)

事件日志未找到?我正在使用 Application 日志,该日志明显存在,并且我将 PathType 参数设置为 LogName。出了什么问题?

  • 我已验证传递的 exportPath 是一个完全限定的文件路径,且目录存在。
  • 此应用程序始终在管理员上下文中运行,因此似乎不是权限问题。
  • 有趣的是,这个问题在一个简单的控制台应用程序中无法重现。

根据堆栈跟踪,异常是由 Win32 本机函数 EvtExportLog 抛出的。


不确定,但可以将其放在trycatch块中进行封装。 - Nexo
1
@Mike,我能够重现这种行为,但只有在以提升的上下文中执行应用程序时才会出现。如果在非管理员上下文中执行它,你的代码完美运行(在我的机器上)。我还不知道为什么会这样,但可能对你来说这也是一个(临时的)解决方案。 - Markus Safar
@MarkusSafar - 谢谢!这是一个很好的线索。不幸的是,这个应用程序需要在提升的上下文中运行,出于其他目的。我想知道我们是否发现了一个错误? - Mike Bruno
1
你的导出路径对管理员上下文是否可访问?一个例子是网络驱动器,默认情况下,用户的网络驱动器不会对其管理对应方(以管理员身份运行,基本上在具有管理员权限的镜像会话中运行)开放。试试硬编码目标路径吗?(比如C:\tmp\export.evt)只是为了检查一下? - Irwene
3个回答

0
如果EventLogNotFoundException的Message是"The system cannot find the path specified",那么请确保exportPath包含一个现有的文件路径。

请重新阅读问题。你的回答与原帖的问题毫无关系。 - Markus Safar
OP遇到了一个EventLogNotFoundException,我认为OP需要查看异常的消息,因为异常可能会带有不同的消息。如果OP遇到了"The system cannot find the path specified"的异常,我不能确定,但这是有可能的。你告诉我这与OP的问题无关,这是荒谬的。另外,我无法复现你所说的情况:以管理员权限运行时无法工作。 - user7994388
是的,你说得对。我不知怎么误解了你的回答,对此我道歉。 - Markus Safar
@MarkusSafar 没问题,没关系。 - user7994388

0
问题不在代码中,而是在参数值中,特别是在targetFilePath参数中:
  1. 确保目标目录路径存在。此方法不会创建缺失的目录。
  2. 确保目标文件不存在。此方法无法覆盖现有文件。
  3. 确保您传递的是文件的完整路径。此方法不支持相对路径和环境变量。
EventLogNotFoundException与第一个path参数无关,它也可能与targetFilePath参数有关。我怀疑这就是问题所在。

谢谢,你是对的。exportPath 参数包含一个不存在的目录。异常类型名 EventLogNotFoundException 极其误导。 - Mike Bruno

0
尝试将您的eventLogSession.ExportLog调用包装在try-catch块中,这样可以提供更详细的错误信息,有助于诊断问题。

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