尝试使用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
这看起来像FileLoggingSession中的一个错误。
我理解FileLoggingSession的工作原理如下: FileLoggingSession在内部使用有界缓冲区。达到其绑定时,它会将消息刷新到磁盘文件。如果未附加LogFileGenerated事件处理程序,则会创建日志文件,直到磁盘已满。如果附加了LogFileGenerated事件处理程序(以允许我们移走文件),则在执行事件处理程序后会自动删除该文件。
因此,FileLoggingSession永远不会占用更多的内存,而不是比1个日志文件更多的磁盘存储空间。这两个限制都没有记录,但似乎大约是256KB。
答案 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等)。