如何过滤Azure日志或WCF数据服务filter的傻瓜
我正在查看WADLogsTable中的Azure日志,并希望过滤结果,但是我不知道如何去做。 有一个文本框,说:
“input一个WCF数据服务filter来限制返回的实体”
什么是“WCF数据服务filter”的语法? 以下给我一个InvalidValueType错误说:“指定的值是无效的。”:
Timestamp gt '2011-04-20T00:00'
我甚至closures? 是否有方便的语法参考?
这个查询应该是这样的格式:
Timestamp gt datetime'2011-04-20T00:00:00'
记住把那个datetime
放在那里是重要的。
这使我每次都会出差,所以我使用OData概览作为参考。
添加knightffhor的响应,你当然可以写一个查询过滤Timstamp,但这不是build议的方法,因为查询“时间戳”属性将导致全表扫描。 而是在PartitionKey属性上查询此表。 我从这里的其他线程复制我的回应( 我可以远程捕获Azure Web / Workerangular色的性能计数器? ):
“这里关键的一件事是了解如何有效地查询这个表格(和其他诊断表格),我们希望从诊断表格中获取数据的一个方面就是获取数据一段时间。在Timestamp属性上查询这个表,但是这是一个糟糕的deviseselect,因为你知道Azure表中的数据是在PartitionKey和RowKey上索引的,查询任何其他属性将导致全表扫描,当你的表包含大量数据。关于这些日志表的好处在于,PartitionKey值以某种方式表示数据点收集的date/时间。基本上,PartitionKey是使用DateTime.Ticks(UTC)的更高位创build的。因此,如果要获取特定date/时间范围的数据,首先需要计算范围(以UTC为单位)的Ticks,然后在其前面加上“0”,并在查询中使用这些值。如果你正在查询使用RES T API,你可以使用类似下面的语法:PartitionKey ge'0 <从date/时间滴答UTC>'和PartitionKey le'0 <date/时间UTC>'。
我写了一篇关于如何编写WCF查询的表格存储的博客post,您可能会发现它有用: http : //blog.cerebrata.com/specifying-filter-criteria-when-querying-azure-table-storage-using- REST的API /
另外,如果您正在寻找用于查看和pipe理诊断数据的第三方工具,我可以build议您查看我们的产品Azure诊断pipe理器:/ Products / AzureDiagnosticsManager。 此工具专门用于显示和pipe理Windows Azure诊断数据。
我接受的答案帮助我通过Visual Studio直接查询表格。 但是,最终我需要更强大的解决scheme。 我用我在这里获得的技巧来开发C#中的一些类,让我使用LINQ查询表。 如果其他人查看这个问题是有用的,这里大概是我现在如何查询我的Azure日志。
创build一个inheritance自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); } } }
创build一个inheritance自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"); } } }
我有一个帮助器方法从configuration设置中创build一个CloudStorageAccount
:
public CloudStorageAccount GetStorageAccount() { CloudStorageAccount.SetConfigurationSettingPublisher( (name, setter) => setter(RoleEnvironment.GetConfigurationSettingValue(name))); string configKey = "Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString"; return CloudStorageAccount.FromConfigurationSetting(configKey); }
我从CloudStorageAccount
创build一个AzureDiagnosticContext
并使用它来查询我的日志:
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; }
此方法利用Gaurav的答案中的性能提示来过滤PartitionKey
而不是Timestamp
。
如果你想过滤结果不仅仅是date,你可以过滤返回的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)); ... }
最后,我实际上进一步将这些类中的大部分抽象为基类,以便重用查询其他表的function,例如存储Windows事件日志的表。