我正在使用azure blob存储来存储一些文件。
我想检索存储在azure blob存储中的给定blob的下载次数。
我该怎么做?
目前,我正在关注TotalEgress,但这还不够,因为TotalEgress只为您提供了Total的blobstorage服务的下载文件大小。
每个blob可能存在Egress,或类似的东西......?
对此有何帮助?
答案 0 :(得分:1)
据我所知,blob存储不支持直接获取下载次数。
我建议你可以添加feedback这个要求。
以下是两种解决方法:
1.在客户端。
您可以尝试通过创建应用程序来计算下载数量。
如果用户单击下载按钮或其他内容,请获取下载次数(您可以将其存储到blob文件元数据中)并进行计算。
注意:azure blob具有公共和私有权限。如果blob是公共的,我们可以直接从url下载blob。所以我建议你可以尝试将blob权限设置为私有。通过这样做,下载次数t是正确的。
2.在服务器端。
据我所知,如果启用azure存储帐户的诊断'blob日志,它将记录blob的每个读/写/删除操作。
通过阅读这些操作,我认为您可以获得存储在azure blob存储中的给定blob的下载(getblob操作)计数。
这些日志存储在$ log容器中。
注意:存储日志的大小限制(20TB)和日期限制(MAX 365)。所以我建议您尝试运行timertrigger webjob来搜索日志。 在此webjobs中,您可以使用azure storage SDK的CloudAnalyticsClient获取日志并将数量和扫描日期存储在文件元数据中。每次timertrigger webjob运行时,您只需要从上次扫描日期搜索上下文。(此解决方法可能有一些延迟。)
有关如何使用CloudAnalyticsClient获取日志记录的更多详细信息,您可以参考下面的代码示例:
CloudStorageAccount storageAccount = CloudStorageAccount.Parse("");
CloudAnalyticsClient c1 = storageAccount.CreateCloudAnalyticsClient();
DateTimeOffset starttime = DateTime.Now.AddHours(-6);
DateTimeOffset endtime = DateTime.Now;
var r1 = c1.ListLogRecords(Microsoft.WindowsAzure.Storage.Shared.Protocol.StorageService.Blob, starttime, endtime).ToList();
if (r1 != null)
{
Console.WriteLine("Start");
}
int i = 0;
foreach (var item in r1)
{
if (item.RequestUrl.ToString().Contains("Penjs.png(your file name)"))
{
Console.WriteLine(string.Format("AuthenticationType : {0} , ClientRequestId : {1} , ReferrerHeader : {2} , RequestUrl : {3} , RequestStatus : {4} , HttpStatusCode : {5} , OperationType : {6}", item.AuthenticationType, item.ClientRequestId, item.ReferrerHeader, item.RequestUrl, item.RequestStatus, item.HttpStatusCode, item.OperationType));
Console.WriteLine("----------------------------------");
}
//count the get blob number
if (item.RequestUrl.ToString().Contains("Penjs.png") && item.OperationType == "GetBlob" && item.RequestStatus =="Success")
{
i++;
}
}
Console.WriteLine("Get/Dowanload blob time : " + i);
Console.WriteLine("Complete");
结果: