使用 FileLoggingSession 时出错 "Not enough storage"

Error "Not enough storage" using FileLoggingSession

试验 Windows.Foundation.Diagnostics FileLoggingSession 我收到异常 "Not enough storage is available to process this command"。在某种程度上,文件似乎会自动删除。不管我在 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

Complete code sample here.

在我看来,这像是 FileLoggingSession 中的错误。

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

因此,FileLoggingSession 消耗的内存绝不能超过缓冲区大小,磁盘存储空间也不应超过 1 个日志文件 space。这两个限制都没有记录,但似乎约为 256KB。

我将此报告为错误 here

有人知道 post 此类错误的更好位置吗?

我知道这是一个老问题,但我只是 运行 进入这个问题并认为其他人可能会发现这些信息有用。

截至今天(2017-08-14),该错误仍然存​​在。有一个解决方法:定期启动异步操作并等待它。当您的线程空闲时,记录器显然使用它来将事件转储到日志、轮转日志文件等等。但是谁愿意在他的代码中添加 await Task.Delay( 500 );

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

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

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