编程语言
首页 > 编程语言> > c#-LoggingSession.SaveToFileAsync有时会创建以.etl.tmp结尾的文件

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