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()
数据准备就绪的时间。
我在 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()
数据准备就绪的时间。