Azure:以编程方式查询WADLogsTable以获取跟踪数据

本文关键字:获取 跟踪 WADLogsTable 数据 方式 编程 Azure 查询 | 更新日期: 2023-09-27 18:27:48

我正试图使用以下代码从Azure获取最后一小时的所有跟踪数据:

                StorageCredentialsAccountAndKey storageCredentialsAccountAndKey = new StorageCredentialsAccountAndKey(accountName, key);
                CloudStorageAccount csa = new CloudStorageAccount(storageCredentialsAccountAndKey, true);
                TableServiceContext tableServiceContext = new TableServiceContext(csa.TableEndpoint.ToString(), csa.Credentials);
                var results = tableServiceContext.CreateQuery<TableServiceEntity>("WADLogsTable").Where(
                    x => x.Timestamp > DateTime.UtcNow.AddHours(-1)).ToList();

然而,当我知道表中有最后一个小时的数据时,我发现没有找到任何结果(我正在将输出与Cerebrata的Azure Diagnostics Manager进行比较)。

我有两个问题:

  1. 这是查询WADLogsTable的正确方法吗?为什么我没有看到结果
  2. 作为泛型传入的正确类型是什么参数TableServiceEntity是一个基类,它只定义三列。我想知道是否有代表WADLogsTable实体。我只是用创建一个类型吗属性是否与列名相同

Azure:以编程方式查询WADLogsTable以获取跟踪数据

没有现成的类型(类)可以表示WADLogs实体。使用基类,您将只获得PartionKey、RowKey和Timestamp属性。你必须自己定义它。这里有一个我使用的样本:

public class WadLogEntity
       : Microsoft.WindowsAzure.StorageClient.TableServiceEntity
    {
        public WadLogEntity()
        {
            PartitionKey = "a";
            RowKey = string.Format("{0:10}_{1}", DateTime.MaxValue.Ticks - DateTime.Now.Ticks, Guid.NewGuid());
        }
        public string Role { get; set; }
        public string RoleInstance { get; set; }
        public int Level { get; set; }
        public string Message { get; set; }
        public int Pid { get; set; }
        public int Tid { get; set; }
        public int EventId { get; set; }
        public DateTime EventDateTime
        {
            get
            {
                return new DateTime(long.Parse(this.PartitionKey.Substring(1)));
            }
        }
    }

此外,当我在处理WADLogs表时,我设法让它显示了(过去24小时的)结果,代码是:

  var dtThen = DateTime.UtcNow.AddHours(-24);
                var dtNow = DateTime.UtcNow;
                var logs = this._wadLogs.WadLogs.Where(
                    wl => 
                        wl.Level == 2 
                        && String.Compare(wl.PartitionKey,"0" + dtThen.Ticks.ToString()) >=0
                        && String.Compare(wl.PartitionKey, "0" + dtNow.Ticks.ToString()) < 0
                    ).Take(200);

我注意到在ticks计数之前的分区键中有一个"0"前缀。

对于最新(2014)Azure存储客户端的用户:

http://blogs.msdn.com/b/tilovell/archive/2014/02/11/how-to-view-azure-diagnostics-traces-from-wadlogstable-in-your-local-console-app.aspx

tl;dr可以使用时间戳进行筛选。

...
var query = table.CreateQuery<GenericTableEntity>()
    .Where(e => e.Timestamp > DateTime.UtcNow.AddMinutes(-120));

通过扩展链接示例中的实体,您可以公开Message和Date变量:

public class LogEntity : GenericTableEntity 
{
    // Since Timestamp is a DateTimeOffset
    public DateTime LogDate
    {
        get { return Timestamp.UtcDateTime; }
    }
    public string Message
    {
        get { return Properties["Message"].StringValue; }
    }
}