c#-LoggingSession.SaveToFileAsync有时会创建以.etl.tmp结尾的文件
作者:互联网
我有一个通用的Windows / WindowsPhone 8.1应用程序,在其中运行应用程序时,我使用LoggingSession记录消息.
当发生未处理的异常时,我记录该异常,然后等待对LoggingSession.SaveToFileAsync的调用以将日志转储到文件中.下次启动我的应用程序时,我将上传日志文件并最终收到它.
我看到的问题是有时我的日志文件以.etl.tmp结尾(通常文件大小为50-100 Kb),当我尝试打开它们(使用tracerpt或Windows Event Viewer)时,我看不到任何内容日志.有时我打开.etl.tmp文件,这些文件通常大小约为200Kb,并且看到一些日志条目.在其他情况下,日志文件(通常在20Kb以下)正确以.etl扩展名结尾(没有.tmp),并且所有已记录的消息都在那里.
1)为什么LoggingSession.SaveToFileAsync有时会生成扩展名为.etl.tmp的文件?
2)关于如何解决此问题的任何建议?在将它们保存到文件之前,我需要捕获所有日志(甚至是未处理的异常),因此这就是为什么我在应用程序的未处理异常事件处理程序中调用LoggingSession.SaveToFileAsync的原因.我还需要我的日志记录解决方案具有出色的性能,而又不能减慢我的应用程序运行速度.
谢谢
这是精简的示例代码:
public sealed partial class App : Application
{
.
.
.
public static ETWLogger Logger;
public App()
{
InitializeComponent();
Logger = new ETWLogger();
Suspending += OnSuspending;
UnhandledException += OnUnhandledExceptionAsync;
}
private async void OnUnhandledExceptionAsync(object sender, UnhandledExceptionEventArgs args)
{
await Logger.SaveToFileAsync();
}
protected override void OnLaunched(LaunchActivatedEventArgs e)
{
// Check to see if there are files in the Log folder. If so
// then upload them and then delete all files in the Log folder.
}
.
.
.
}
public class ETWLogger
{
private LoggingSession _session;
private LoggingChannel _channel;
private StorageFolder _logFolder;
.
.
.
public ETWLogger()
{
.
.
.
_session = new LoggingSession("DefaultSession");
_channel = new LoggingChannel("DefaultChannel");
_session.AddLoggingChannel(_channel);
_logFolder = StorageHelper.CreateSubFolder(ApplicationData.Current.LocalFolder, "LogFiles", CreationCollisionOption.OpenIfExists);
.
.
.
}
public async Task SaveToFileAsync()
{
if (_session == null) return;
var fileName = DateTime.Now.ToString("yyyyMMdd-HHmmssTzz", CultureInfo.InvariantCulture) + ".etl";
await _session.SaveToFileAsync(_logUploadFolder, fileName);
}
.
.
.
}
解决方法:
我有一个很好的主意,这是怎么回事.您描述了Microsoft使用的一种通用技术,它可以防止文件损坏和数据丢失.它不会创建您要求的foo.etl文件,而是先创建一个具有不同名称的文件.就像foo.etl.tmp.仅当成功写入文件或换句话说,async方法实际完成后,才将文件从foo.etl.tmp重命名为foo.etl.
现在,您将有一个极好的保证,可以确保始终获得完全书面的“良好”文件.没有腐败.而且,如果以前的文件具有相同的名称,则不会被损坏的半写文件替换.没有数据丢失.
When an unhandled exception occurs, I log the exception and then I await a call
问题是“未处理的异常”.仅当异常的致命程度不足以防止异步/等待管道继续工作时,才能完全写入日志文件.换句话说,您现在仅获得“轻微”异常信息.不良的文件将生成半写的foo.etl.tmp文件,该应用程序在完成之前就已经准备就绪.
如果您想了解“不良”事件,则无法在这里使用await. SaveToFileAsync()调用必须同步完成.
标签:logging,win-universal-app,winrt-xaml,c 来源: https://codeday.me/bug/20191120/2045535.html