NLog UWP手动删除/导出日志

时间:2018-10-14 11:40:26

标签: c# uwp nlog

我在C#UWP应用中使用NLog。 我想添加一个按钮,用于删除/导出NLog手动创建的所有日志。

这可能吗?如果是,怎么办?

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

1 个答案:

答案 0 :(得分:4)

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

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

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

删除日志

删除日志非常容易-您进入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
    }
}

由于记录器当前可以打开某些文件,因此我特意跳过了潜在的异常。

导出日志

导出要求您首先从logs文件夹中创建一个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()来告诉系统我们开始了异步操作,它应该等待{{ 1}}何时数据准备就绪。