【问题标题】:ETW - deleting log file causes logging to break?ETW - 删除日志文件会导致日志记录中断?
【发布时间】:2015-03-11 04:46:42
【问题描述】:

我已开始使用 Microsoft 推荐的 ETW 日志记录,因为它具有高性能并防止重新发明轮子等。

但是我发现,如果有人删除了日志文件,那么日志记录就会停止工作,直到跟踪会话停止并重新启动。如果 API 确实返回了错误,我可以忍受这种情况,因此我可以自己重新启动它,但没有返回任何错误代码。

我的问题是 - 我该如何处理这种情况?有没有办法告诉 ETW 锁定文件以防止删除?是否应该返回错误?

请注意,我使用的是 NT5 API 级别,但在 NT6+ 上会出现此问题。

相关 API:

RegisterTraceGuids
StartTrace
EnableTrace
TraceEvent

我希望在删除文件时可以调用控件回调,但没有任何反应。

【问题讨论】:

    标签: winapi etw


    【解决方案1】:

    如果您使用 EventSource 库,请查看 Vance Morrison 的博客条目,Why doesn't my EventSource produce any events? 简短的回答:异常通常会被吞没,因为日志系统不应使您的应用程序崩溃。在博客条目中,他解释了如何通过建立外部跟踪会话来查看引发的异常。您可能希望定期轮询文件是否存在,并以某种您可以检测到的方式发出错误报告。

    【讨论】:

    • 我使用的是原始 win32 API,因此不会有任何异常(除了访问冲突,这意味着操作系统中的错误)
    • 我一直在 .net 包装器中使用它,我也没有看到太多关于那里失败的信息。 ETW 的设计主要是让日志文件的创建与事件跟踪生成是一个单独的过程。
    • 所以你认为在日志文件运行时删除它意味着它应该在下次重新启动之前静默失败?即使 ETW 会话在下次重新启动时消失了?对我来说似乎是一个巨大的缺陷
    • @paulm 我不知道该问题的最佳解决方案,但这是设计背后的基本原理。继续运行应用程序或服务比记录它更重要。有一个构造函数可以与 .net EventSource 类一起使用,它会导致它在失败时抛出异常:msdn.microsoft.com/en-us/library/hh485655(v=vs.110).aspx
    • 文件删除问题似乎是由于内核持有一个未决删除 ETL 文件的打开句柄,所以它一定是内核方面的修复..
    猜你喜欢
    • 1970-01-01
    • 2018-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-26
    • 2014-09-07
    • 1970-01-01
    • 2022-10-14
    相关资源
    最近更新 更多