在 Azure Table 存储中存储应用程序日志的策略
Strategy for storing application logs in Azure Table Storage
我要确定在 Azure Table 存储中存储日志记录信息的良好策略。我有以下内容:
PartitionKey: The name of the log.
RowKey: Inversed DateTime ticks,
这里唯一的问题是分区可能会变得非常大(数百万个实体)并且大小会随着时间的推移而增加。
但话虽这么说,正在执行的查询类型将始终包括 PartitionKey
(无扫描)和 RowKey
过滤器(次要扫描)。
例如(自然语言):
where `PartitionKey` = "MyApiLogs" and
where `RowKey` is between "01-01-15 12:00" and "01-01-15 13:00"
假设在 PartitionKey
和 RowKey
上都进行了查询,我知道分区的大小无关紧要。
看看我们的新 Table Design Patterns Guide - 特别是日志数据反模式,因为它讨论了这种情况和替代方案。通常,当人们写入日志文件时,他们会使用 PK 的日期,这会导致分区变热,因为所有写入都将写入单个分区。 Blob 通常最终成为日志数据的更好目的地 - 因为人们通常最终会批量处理日志 - 该指南将此作为一种选择进行讨论。
添加我自己的答案,这样人们就可以在不需要外部链接的情况下获得内联内容。
您希望分区键是时间戳加上消息的哈希码。在大多数情况下这已经足够好了。如果需要,您也可以将任何其他 key/value 对的哈希码添加到消息的哈希码中,但我发现这并不是真正必要的。
示例:
string partitionKey = DateTime.UtcNow.ToString("o").Trim('Z', '0') + "_" + ((uint)message.GetHashCode()).ToString("X");
string rowKey = logLevel.ToString();
DynamicTableEntity entity = new DynamicTableEntity { PartitionKey = partitionKey, RowKey = rowKey };
// add any additional key/value pairs from the log call to the entity, i.e. entity["key"] = value;
// use InsertOrMerge to add the entity
查询日志时,您可以使用带有分区键的查询,分区键是您要检索日志的开始时间,通常是从当前 date/time 起 1 分钟或 1 小时。然后,您可以使用不同的 date/time 戳记向后翻页一分钟或一小时。这避免了建议从 DateTime.MaxValue.
中减去 date/time 标记的奇怪 date/time 黑客攻击
如果您特别喜欢将搜索服务放在 Azure table 存储之上,那么您可以快速查找 key/value 对。
如果您使用的是 Azure 函数,这将比应用程序洞察便宜得多,我建议禁用它。如果您需要多个日志名称,只需添加另一个 table.
我要确定在 Azure Table 存储中存储日志记录信息的良好策略。我有以下内容:
PartitionKey: The name of the log.
RowKey: Inversed DateTime ticks,
这里唯一的问题是分区可能会变得非常大(数百万个实体)并且大小会随着时间的推移而增加。
但话虽这么说,正在执行的查询类型将始终包括 PartitionKey
(无扫描)和 RowKey
过滤器(次要扫描)。
例如(自然语言):
where `PartitionKey` = "MyApiLogs" and
where `RowKey` is between "01-01-15 12:00" and "01-01-15 13:00"
假设在 PartitionKey
和 RowKey
上都进行了查询,我知道分区的大小无关紧要。
看看我们的新 Table Design Patterns Guide - 特别是日志数据反模式,因为它讨论了这种情况和替代方案。通常,当人们写入日志文件时,他们会使用 PK 的日期,这会导致分区变热,因为所有写入都将写入单个分区。 Blob 通常最终成为日志数据的更好目的地 - 因为人们通常最终会批量处理日志 - 该指南将此作为一种选择进行讨论。
添加我自己的答案,这样人们就可以在不需要外部链接的情况下获得内联内容。
您希望分区键是时间戳加上消息的哈希码。在大多数情况下这已经足够好了。如果需要,您也可以将任何其他 key/value 对的哈希码添加到消息的哈希码中,但我发现这并不是真正必要的。
示例:
string partitionKey = DateTime.UtcNow.ToString("o").Trim('Z', '0') + "_" + ((uint)message.GetHashCode()).ToString("X");
string rowKey = logLevel.ToString();
DynamicTableEntity entity = new DynamicTableEntity { PartitionKey = partitionKey, RowKey = rowKey };
// add any additional key/value pairs from the log call to the entity, i.e. entity["key"] = value;
// use InsertOrMerge to add the entity
查询日志时,您可以使用带有分区键的查询,分区键是您要检索日志的开始时间,通常是从当前 date/time 起 1 分钟或 1 小时。然后,您可以使用不同的 date/time 戳记向后翻页一分钟或一小时。这避免了建议从 DateTime.MaxValue.
中减去 date/time 标记的奇怪 date/time 黑客攻击如果您特别喜欢将搜索服务放在 Azure table 存储之上,那么您可以快速查找 key/value 对。
如果您使用的是 Azure 函数,这将比应用程序洞察便宜得多,我建议禁用它。如果您需要多个日志名称,只需添加另一个 table.