我在C#UWP应用中使用NLog。 我想添加一个按钮,用于删除/导出NLog手动创建的所有日志。
这可能吗?如果是,怎么办?
导出日志应创建一个ZIP文件,然后我可以将其保存到给定的路径。
答案 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}}何时数据准备就绪。