Ответ , который я принял , очень помог мне в непосредственном запросе таблицы через Visual Studio.Однако в конце концов мне понадобилось более надежное решение.Я использовал полученные здесь советы для разработки некоторых классов на C #, которые позволяют мне использовать LINQ для запросов к таблицам.В случае, если это полезно для других пользователей, просматривающих этот вопрос, вот пример того, как я теперь запрашиваю свои журналы Azure.
Создайте класс, который наследуется от Microsoft.WindowsAzure.StorageClient.TableServiceEntity
, чтобы представить все данные вТаблица "WADLogsTable":
public class AzureDiagnosticEntry : TableServiceEntity
{
public long EventTickCount { get; set; }
public string DeploymentId { get; set; }
public string Role { get; set; }
public string RoleInstance { get; set; }
public int EventId { get; set; }
public int Level { get; set; }
public int Pid { get; set; }
public int Tid { get; set; }
public string Message { get; set; }
public DateTime EventDateTime
{
get
{
return new DateTime(EventTickCount, DateTimeKind.Utc);
}
}
}
Создайте класс, который наследуется от Microsoft.WindowsAzure.StorageClient.TableServiceContext
и ссылается на недавно определенный класс объектов данных:
public class AzureDiagnosticContext : TableServiceContext
{
public AzureDiagnosticContext(string baseAddress, StorageCredentials credentials)
: base(baseAddress, credentials)
{
this.ResolveType = s => typeof(AzureDiagnosticEntry);
}
public AzureDiagnosticContext(CloudStorageAccount storage)
: this(storage.TableEndpoint.ToString(), storage.Credentials) { }
// Helper method to get an IQueryable. Hard code "WADLogsTable" for this class
public IQueryable<AzureDiagnosticEntry> Logs
{
get
{
return CreateQuery<AzureDiagnosticEntry>("WADLogsTable");
}
}
}
У меня естьвспомогательный метод, который создает CloudStorageAccount
из параметров конфигурации:
public CloudStorageAccount GetStorageAccount()
{
CloudStorageAccount.SetConfigurationSettingPublisher(
(name, setter) => setter(RoleEnvironment.GetConfigurationSettingValue(name)));
string configKey = "Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString";
return CloudStorageAccount.FromConfigurationSetting(configKey);
}
Я создаю AzureDiagnosticContext
из CloudStorageAccount
и использую его для запроса моих журналов:
public IEnumerable<AzureDiagnosticEntry> GetAzureLog(DateTime start, DateTime end)
{
CloudStorageAccount storage = GetStorageAccount();
AzureDiagnosticContext context = new AzureDiagnosticContext(storage);
string startTicks = "0" + start.Ticks;
string endTicks = "0" + end.Ticks;
IQueryable<AzureDiagnosticEntry> query = context.Logs.Where(
e => e.PartitionKey.CompareTo(startTicks) > 0 &&
e.PartitionKey.CompareTo(endTicks) < 0);
CloudTableQuery<AzureDiagnosticEntry> tableQuery = query.AsTableServiceQuery();
IEnumerable<AzureDiagnosticEntry> results = tableQuery.Execute();
return results;
}
Этот метод использует подсказку производительности в ответ Гаурава для фильтрации по PartitionKey
вместо Timestamp
.
Если вы хотите отфильтровать результаты более чем напросто дата, вы могли бы отфильтровать возвращенные IEnumerable
.Но вы, вероятно, получите лучшую производительность, отфильтровав IQueryable
.Вы можете добавить параметр фильтра к вашему методу и вызвать его в IQueryable.Where()
.Например,
public IEnumerable<AzureDiagnosticEntry> GetAzureLog(
DateTime start, DateTime end, Func<AzureDiagnosticEntry, bool> filter)
{
...
IQueryable<AzureDiagnosticEntry> query = context.Logs.Where(
e => e.PartitionKey.CompareTo(startTicks) > 0 &&
e.PartitionKey.CompareTo(endTicks) < 0 &&
filter(e));
...
}
В конце я фактически абстрагировал большинство этих классов в базовые классы, чтобы повторно использовать функциональные возможности для запроса других таблиц, таких как таблица, хранящая журнал событий Windows.