使用FileLoggingSession

时间:2015-11-09 18:16:35

标签: uwp etw

尝试使用Windows.Foundation.Diagnostics FileLoggingSession我收到异常“没有足够的存储空间来处理此命令”。在某一点上,文件似乎会被自动删除。无论我在LogFileGenerated事件中做了什么,我都遇到了“Not enough Storage”。为什么会这样?

Private _trace As New LoggingChannel("TraceChannel", New LoggingChannelOptions())
Private _fileLoggingSession As New FileLoggingSession("TraceSession")
Private _bufferedTracesFolder As StorageFolder

Sub New()
    _fileLoggingSession.AddLoggingChannel(_trace)
    AddHandler _fileLoggingSession.LogFileGenerated, AddressOf _fileLoggingSession_LogFileGenerated
End Sub

Sub _fileLoggingSession_LogFileGenerated(sender As IFileLoggingSession, args As LogFileGeneratedEventArgs)
    Debug.WriteLine(args.File.Path)
    'args.File.DeleteAsync().AsTask.Wait()
    'HandleTraceFile(args.File).Wait()
End Sub

Async Sub button_Click(sender As Object, e As RoutedEventArgs) Handles button.Click
    _bufferedTracesFolder = Await ApplicationData.Current.LocalFolder.CreateFolderAsync("LatestTraces", CreationCollisionOption.OpenIfExists)
    Await GenerateTraces()
End Sub

Async Function GenerateTraces() As Task
    Dim random As New Random
    Await Task.Run(
        Sub()
            For i = 0 To 1000000
                Dim txt As New String("x", random.Next(50, 1000))
                _trace.LogMessage($"{i} {txt}")
            Next
        End Sub)
End Function

File Explorer screen shot

Complete code sample here.

这看起来像FileLoggingSession中的一个错误。

我理解FileLoggingSession的工作原理如下: FileLoggingSession在内部使用有界缓冲区。达到其绑定时,它会将消息刷新到磁盘文件。如果未附加LogFileGenerated事件处理程序,则会创建日志文件,直到磁盘已满。如果附加了LogFileGenerated事件处理程序(以允许我们移走文件),则在执行事件处理程序后会自动删除该文件。

因此,FileLoggingSession永远不会占用更多的内存,而不是比1个日志文件更多的磁盘存储空间。这两个限制都没有记录,但似乎大约是256KB。

2 个答案:

答案 0 :(得分:0)

我将此报告为错误here

有人知道发布此类错误的更好地方吗?

答案 1 :(得分:0)

我知道这是一个老问题,但我刚刚遇到这个并认为其他人可能会发现这些信息很有用。

截至今日(2017-08-14),该问题仍然存在。有一种解决方法:定期启动异步操作并等待它。当您的线程处于空闲状态时,记录器显然会使用它将事件转储到日志,旋转日志文件等等。但谁愿意用await Task.Delay( 500 );撒上他的代码?

另一件事。由ETW创建的日志名为(app)-Log-Session-#.etl左右,其中#从1开始随着日志文件的转移而增加。通知已注册的日志翻转处理程序时,日志将重命名为使用数字0,因此处理程序始终会看到(app)-Log-Session-0.etl

令人遗憾的是,在使用FileLoggingSession.CloseAndSaveToFileAsync()时,重命名并不总是会发生,但传递给处理程序的文件名会收到名称,就像文件已重命名一样......很可爱。

"记录" UWP示例显示了两个错误。对于第一个,只需删除FileLoggingSessionScenario.cs中的Task.Delay();第二个更难以捉摸,但你可以尝试为日志做一些额外的强制关闭(暂停app等)。