删除由语义日志记录创建的旧 azure table 存储日志条目
Deleting older azure table storage log entries created by semantic logging
我已经实现了语义日志记录以将条目记录到 azure table 存储中。现在我想从 azure table 中删除旧的日志条目(比如超过 30 天)。问题是azuretable中的partitionKeys和RowKeys是动态生成的。像这样
PartitionKey RowKey
2519569987199999999 MyProjectName_2519569788418593594_FFFFFFF8 //entry date 20 october 2015
2519573205599999999 MyProjectName_2519573006928838932_FFFFFFE1 // entry date 16 october 2015
我研究了一下,PartitionKey的格式是DateTime.MaxValue.Ticks - DateTime.UtcNow.Ticks
如何从 table 中获取数据进行删除?由于 partitionKey 是动态的,我是否需要进行完整的 table 扫描?
How can I fetch data from the table for deletion? Would I need to do a
full table scan since the partitionKey is dynamic?
不,您不需要进行完整的 table 扫描。下面介绍了如何找出在 30 天之前创建的实体。
var today = DateTime.UtcNow.Date;
var thirtyDaysFromToday = today.AddDays(-30);
var pk = (DateTime.MaxValue.Ticks - thirtyDaysFromToday.Ticks).ToString();
var account = new CloudStorageAccount(new StorageCredentials(accountName, accountKey), true);
var tableClient = account.CreateCloudTableClient();
var table = tableClient.GetTableReference("YourTableName");
TableQuery query = new TableQuery().Where("PartitionKey ge '" + pk + "'").Select(new List<string>(){"PartitionKey", "RowKey"});//Since you only need PartitionKey/RowKey for entities deletion thus just fetch that only
TableContinuationToken token = null;
do
{
var queryResult = table.ExecuteQuerySegmented(query, token);
token = queryResult.ContinuationToken;
var entities = queryResult.Results;
//Now you can delete those entities
}
while (token != null);
注意:我还没有测试代码,所以请先尝试使用较小的数据集,然后再全力以赴:)
我已经实现了语义日志记录以将条目记录到 azure table 存储中。现在我想从 azure table 中删除旧的日志条目(比如超过 30 天)。问题是azuretable中的partitionKeys和RowKeys是动态生成的。像这样
PartitionKey RowKey
2519569987199999999 MyProjectName_2519569788418593594_FFFFFFF8 //entry date 20 october 2015
2519573205599999999 MyProjectName_2519573006928838932_FFFFFFE1 // entry date 16 october 2015
我研究了一下,PartitionKey的格式是DateTime.MaxValue.Ticks - DateTime.UtcNow.Ticks
如何从 table 中获取数据进行删除?由于 partitionKey 是动态的,我是否需要进行完整的 table 扫描?
How can I fetch data from the table for deletion? Would I need to do a full table scan since the partitionKey is dynamic?
不,您不需要进行完整的 table 扫描。下面介绍了如何找出在 30 天之前创建的实体。
var today = DateTime.UtcNow.Date;
var thirtyDaysFromToday = today.AddDays(-30);
var pk = (DateTime.MaxValue.Ticks - thirtyDaysFromToday.Ticks).ToString();
var account = new CloudStorageAccount(new StorageCredentials(accountName, accountKey), true);
var tableClient = account.CreateCloudTableClient();
var table = tableClient.GetTableReference("YourTableName");
TableQuery query = new TableQuery().Where("PartitionKey ge '" + pk + "'").Select(new List<string>(){"PartitionKey", "RowKey"});//Since you only need PartitionKey/RowKey for entities deletion thus just fetch that only
TableContinuationToken token = null;
do
{
var queryResult = table.ExecuteQuerySegmented(query, token);
token = queryResult.ContinuationToken;
var entities = queryResult.Results;
//Now you can delete those entities
}
while (token != null);
注意:我还没有测试代码,所以请先尝试使用较小的数据集,然后再全力以赴:)