Winapi ETW-删除日志文件会导致日志记录中断吗?

Winapi ETW-删除日志文件会导致日志记录中断吗?,winapi,etw,Winapi,Etw,我已经开始使用微软推荐的ETW日志,因为它的高性能和防止重新发明轮子等 但是我发现,如果有人删除了日志文件,那么日志记录就会停止工作,直到跟踪会话停止并重新启动。如果API真的返回了一个错误,那么我可以自己重新启动它,但是没有任何东西返回任何错误代码,那么我可以接受这种情况 我的问题是——我如何处理这种情况?有没有办法告诉ETW锁定文件以防止删除?是否应该返回错误 请注意,我使用的是NT5API级别,但在NT6+上可以看到这个问题 相关API: RegisterTraceGuids StartT

我已经开始使用微软推荐的ETW日志,因为它的高性能和防止重新发明轮子等

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

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

请注意,我使用的是NT5API级别,但在NT6+上可以看到这个问题

相关API:

RegisterTraceGuids
StartTrace
EnableTrace
TraceEvent

我希望在删除文件时可以调用控件回调,但什么也没有发生。

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

我使用的是原始win32 API,因此不会出现任何异常(除了访问冲突,这意味着操作系统中存在错误),我从.net包装器中使用它,我也没有看到太多关于失败的信息。ETW的主要设计目的是让日志文件的创建与事件跟踪的生成是一个独立的过程。因此,您认为在日志文件运行时删除它意味着它应该在下次重新启动前自动失败吗?即使ETW会话在下次重新启动时消失?对我来说似乎是一个巨大的缺陷me@paulm我不知道该问题的最佳解决方案,但这就是设计背后的基本原理。继续运行应用程序或服务比记录应用程序或服务更重要。有一个构造函数可用于.net EventSource类,它将导致该类在失败时引发异常:文件删除问题似乎是由内核持有挂起的删除ETL文件的打开句柄引起的,因此它一定是内核端修复程序。。