NLog UWP удаляет / экспортирует журналы вручную - PullRequest
0 голосов
/ 14 октября 2018

Я использую NLog в приложении C # UWP.Я хотел бы добавить кнопку для удаления / экспорта всех журналов, созданных NLog вручную.

Возможно ли это?Если да, то как?

При экспорте журналов создается файл ZIP, который я затем могу сохранить по указанному пути.

1 Ответ

0 голосов
/ 14 октября 2018

Ваша конфигурация NLog показывает, что она сохраняет журналы в подпапке Logs папки приложения:

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

. Вы можете найти эту папку вручную, перейдя в C:\Users\[UserName]\AppData\Local\Packages, выполнив поиск идентификатора пакета вашего приложения иперейдите к 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 для этого.После того, как у вас есть файл, вы можете, например, поделиться им, используя системный интерфейс общего доступа.

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(), когда данные будут готовы.

...