/// <summary>
        /// Delete Azure Function Logs from an Azure storage account given the storage connection string.
        /// </summary>
        /// <param name="functionName"></param>
        /// <param name="storageConnectionString"></param>
        /// <returns></returns>
        public static bool RemoveAzureFunctionLogs(string functionName, string storageConnectionString)
        {
            if (!string.IsNullOrEmpty(storageConnectionString))
            {
                var operationContext   = new OperationContext();
                var storageAccount     = CloudStorageAccount.Parse(storageConnectionString);
                var tableClient        = storageAccount.CreateCloudTableClient();
                var logs               = FunctionLogs.GetAzureFunctionLogs(functionName);
                var table              = tableClient.GetTableReference(Constants.AzureFunctionLogTableName);
                var partitions         = logs.GroupBy(log => log.PartitionKey);
                var executionLogsCount = logs.Count(log => log.PartitionKey.Equals(Constants.AzureFunctionLogExecutionPartitionKey,
                                                                                   StringComparison.CurrentCultureIgnoreCase));
                var                 count      = 0;
                const int           batchLimit = 100;
                IList <TableResult> deleteResults;

                foreach (var partition in partitions)
                {
                    var tb       = new TableBatchOperation();
                    var logCount = partition.Count();
                    while (logCount > 0)
                    {
                        var logPool = partition.Skip(count);

                        //azure storage can only process 100 operations at any given time
                        var selectedLogs = logPool.Take(batchLimit).ToList();
                        selectedLogs.ForEach(log => tb.Add(TableOperation.Delete(log)));
                        try
                        {
                            deleteResults = table.ExecuteBatch(tb, null, operationContext);
                            tb.Clear();
                        }
                        catch (Exception e)
                        {
                            deleteResults = new List <TableResult>();
                            Console.WriteLine("--ERROR-- Could not delete logs. {0}", e);
                        }

                        var deletedLogsCount = deleteResults.Count(result => result.HttpStatusCode == 204);
                        count += deletedLogsCount;
                        Console.WriteLine("Deleted {0}/{1} logs", count, executionLogsCount);

                        logCount = logCount - selectedLogs.Count;
                    }
                }

                return(true);
            }
            return(false);
        }
        private bool RemoveAzureFunctionLogs()
        {
            var connectionString = ConfigurationManager.AppSettings["AzureStorageConnectionString"];

            if (!string.IsNullOrEmpty(connectionString))
            {
                var operationContext = new OperationContext();
                var storageAccount   = CloudStorageAccount.Parse(connectionString);
                var tableClient      = storageAccount.CreateCloudTableClient();
                var logs             = FunctionLogs.GetAzureFunctionLogs(FunctionName);
                var table            = tableClient.GetTableReference("AzureFunctionsLogTable");
                logs.ForEach(entity => table.Execute(TableOperation.Delete(entity)));
                return(true);
            }
            return(false);
        }
示例#3
0
 protected override bool Setup()
 {
     return(FunctionLogs.RemoveAllCLoudWatchLogs(FunctionName));
 }