ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

c#-LoggingSession.SaveToFileAsync有时会创建以.etl.tmp结尾的文件

2019-11-20 17:07:46  阅读:218  来源: 互联网

标签:logging win-universal-app winrt-xaml c


我有一个通用的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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有