Windows Azure - 清理 WADLogsTable
我读过关于 Windows Azure 中的 DiagnosticMonitor 使用的 WADLogsTable 表是否会自动删除旧日志条目的相互冲突的信息。
我猜它不会,反而会永远增长——让我花钱。 :)
如果是这种情况,是否有人有一个很好的代码示例来说明如何手动从此表中清除旧日志条目?也许基于时间戳?我会定期从辅助角色运行此代码。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
Windows Azure 诊断创建的表中的数据不会自动删除。
但是,Windows Azure PowerShell Cmdlet 包含专门针对这种情况的 cmdlet。
您需要指定-ToUtc参数,该日期之前的所有日志都将被删除。
如果需要在辅助角色内的 Azure 上执行清理任务,则可以重用 C# cmdlet 代码。 PowerShell Cmdlet 是根据许可的 MS 公共许可证发布的。
基本上,只需要 3 个文件,没有其他外部依赖项:DiagnosticsOperationException.cs、WadTableExtensions.cs、WadTableServiceEntity.cs。
The data in tables created by Windows Azure Diagnostics isn't deleted automatically.
However, Windows Azure PowerShell Cmdlets contain cmdlets specifically for this case.
You need to specify -ToUtc parameter, and all logs before that date will be deleted.
If cleanup task needs to be performed on Azure within the worker role, C# cmdlets code can be reused. PowerShell Cmdlets are published under permissive MS Public License.
Basically, there are only 3 files needed without other external dependencies: DiagnosticsOperationException.cs, WadTableExtensions.cs, WadTableServiceEntity.cs.
更新了Chriseyre2000的功能。对于需要删除数千条记录的情况,这提供了更高的性能:通过 PartitionKey 搜索和分块分步过程。请记住,最好的选择是在存储附近(在云服务中)运行它。
Updated function of Chriseyre2000. This provides much more performance for those cases where you need to delete many thousands records: search by PartitionKey and chunked step-by-step process. And remember that the best choice it is to run it near storage (in cloud service).
您可以根据时间戳执行此操作,但这会非常低效,因为需要扫描整个表。下面是一个代码示例,可能有助于生成分区键以防止“全”表扫描。 http://blogs.msdn.com/b/avkashchauhan/archive/2011/06/24/linq-code-to-query-windows-azure-wadlogstable-to-get-rows-which-存储在特定日期时间之后.aspx
You could just do it based on the timestamp but that would be very inefficient since the whole table would need to be scanned. Here is a code sample that might help where the partition key is generated to prevent a "full" table scan. http://blogs.msdn.com/b/avkashchauhan/archive/2011/06/24/linq-code-to-query-windows-azure-wadlogstable-to-get-rows-which-are-stored-after-a-specific-datetime.aspx
这是一个根据时间戳截断的解决方案。 (针对 SDK 2.0 进行测试)
它确实使用表扫描来获取数据,但如果每天运行一次就不会太痛苦:
Here is a solution that trunctates based upon a timestamp. (Tested against SDK 2.0)
It does use a table scan to get the data but if run say once per day would not be too painful:
这是我的 @Chriseyre2000 解决方案的稍微不同的版本,使用异步操作和 PartitionKey 查询。在我的例子中,它被设计为在辅助角色中连续运行。如果您有很多条目需要清理,这可能会更容易记忆。
要启动该流程,只需从辅助角色的 OnStart 方法中调用此方法即可。
Here's my slightly different version of @Chriseyre2000's solution, using asynchronous operations and PartitionKey querying. It's designed to run continuously within a Worker Role in my case. This one may be a bit easier on memory if you have a lot of entries to clean up.
To start the process, just call this from the OnStart method in your worker role.
如果您不关心任何内容,只需删除该表即可。 Azure 诊断只会重新创建它。
If you don't care about any of the contents, just delete the table. Azure Diagnostics will just recreate it.
稍微更新了 Chriseyre2000 的代码:
使用 ExecuteQuerySegmented 而不是 ExecuteQuery
观察 TableBatchOperation 100 次操作的限制
清除所有 Azure 表
Slightly updated Chriseyre2000's code:
using ExecuteQuerySegmented instead of ExecuteQuery
observing TableBatchOperation limit of 100 operations
purging all Azure tables