NLog UWP delete/export 手动记录

NLog UWP delete/export logs manually

我在 C# UWP 应用程序中使用 NLog。 我想为 deleting/exporting NLog 手动创建的所有日志添加一个按钮。

这可能吗?如果是,如何?

导出日志应该创建一个 ZIP 文件,然后我可以将其保存到给定路径。

您的 NLog 配置显示它将日志保存在应用程序文件夹的 Logs 子文件夹中:

Path.Combine(ApplicationData.Current.LocalFolder.Path, "Logs")

您可以手动找到此文件夹,方法是转到 C:\Users\[UserName]\AppData\Local\Packages,搜索您的应用程序包 ID,然后转到 LocalState,其中应该是 Logs 作为子文件夹。

正在删除日志

删除日志非常简单 - 您进入日志文件夹并尝试删除其中的所有文件:

var logsFolder = await ApplicationData.Current.LocalFolder.CreateFolderAsync(
                         "Logs", CreationCollisionOption.OpenIfExists);
var items = (await logsFolder.GetItemsAsync()).ToArray();
foreach (var item in items)
{
    try
    {
        await item.DeleteAsync(StorageDeleteOption.PermanentDelete);
    }
    catch
    {
        //ignore exception - could happen if some file is currently open
    }
}

因为记录器当前可能打开了一些文件,所以我有意跳过了潜在的异常。

正在导出日志

导出需要您先从日志文件夹中创建一个 zip 文件。您可以使用 ZipFile API 来执行此操作。拥有该文件后,您可以使用系统共享 UI.

来共享它
private async void Export()
{
    var logsFolder = await ApplicationData.Current.LocalFolder.CreateFolderAsync(
        "Logs", 
        CreationCollisionOption.OpenIfExists);

    //first delete existing export if there is one
    var zipFile = await ApplicationData.Current.LocalFolder
                           .TryGetItemAsync("LogsExport.zip");
    if (zipFile != null)
    {
       await zipFile.DeleteAsync();
    }

    //create zip export of logs
    ZipFile.CreateFromDirectory(logsFolder.Path, 
                                Path.Combine(
                                     ApplicationData.Current.LocalFolder.Path,
                                     "LogsExport.zip"),
                                CompressionLevel.Fastest, true);

    //do something with the exported file 
    var dataTransferManager = DataTransferManager.GetForCurrentView();
    dataTransferManager.DataRequested += DataTransferManager_DataRequested;
    DataTransferManager.ShowShareUI();
}

private async void DataTransferManager_DataRequested(DataTransferManager sender,
                                                     DataRequestedEventArgs args)
{
    var dataRequest = args.Request;

    //mark operation as asynchronous
    var deferral = dataRequest.GetDeferral();

    //setting title is mandatory
    dataRequest.Data.Properties.Title = "Share exported logs";

    //set shared file
    var file = await StorageFile.GetFileFromPathAsync(
        Path.Combine(ApplicationData.Current.LocalFolder.Path,
        "LogsExport.zip"));            
    dataRequest.Data.SetStorageItems(new IStorageItem[]{ file });

    //unsubscribe event
    var dataTransferManager = DataTransferManager.GetForCurrentView();
    dataTransferManager.DataRequested -= DataTransferManager_DataRequested;

    //complete operation
    deferral.Complete();
}

因为我们需要获取StorageFile的访问权限,所以我们需要进行异步操作,所以我们使用dataRequest.GetDeferral()告诉系统我们开始了一个异步操作,它应该等待dataRequest.Complete()数据准备就绪的时间。