我们希望将 CDN 日志输入 Graphite 并汇总其中发现的数字(不同 HTTP 状态代码的速率、平均响应大小、平均缓存命中率等)。
然而,日志只是偶尔上传给我们,有时甚至失灵-- 有时,早上的日志可能会在晚上上传,而下午的日志则在几个小时后才上传和处理。此外,由于 CDN(显然)有多个服务器和数据中心,因此不同的日志可能会覆盖重叠期间。
这意味着,任何聚合器都需要保持对全部在处理新日志时,可以使用早期的统计数据来增强聚合......
有什么可以做到这一点吗?我该如何配置 logstash 以将其输入其中?谢谢!
答案1
正如您所知,这是一个复杂的问题。您在问题中标记了 Logstash,所以我假设您有这个标记。
Logstash 负责采集日志。它具有file {}
输入插件只是为了:
input {
file {
path => [ '/opt/export/cdn_logs/*.csv'
tags => [ 'cdnlogs' ]
}
}
和csv {}
过滤器以便于获取 CSV 数据。
filter {
if 'cdnlogs' in [tags] {
csv {
source => "message"
columns => [
'cdndate',
'host_server',
[...]
'response_time' ]
}
}
}
如果您没有 CSV 数据,也许这些行是相当正常的 Apache 格式,一切都不会丢失。您可能需要花时间使用 grok。那是它自己的事。
只要你小心地保留时间戳并且不使用统计信息显然没有保存它们。如果您还没有这样做,Logstash 可以获取日志文件中的日期并将其作为事件的日期/时间戳。
filter {
date {
match => [ "cdndate", "ISO8601" ]
}
}
这将获取日志行的日期/时间戳作为事件的时间戳。太棒了,现在将其变成有用的东西。
Logstash 的库存数据存储是elasticsearch,Elastic(公司)正忙于将其宣传为与 InfluxDB 或 OpenTSDB 等专用工具一样出色的时间序列数据存储。它可以是,但根据我的经验,专用工具的性能更好。所有这些工具都可以(假设您输入正确)以正确的顺序存储无序事件,以便后续查询可以吸收新信息。
Logstash 的输出graphite {}
将保留时间戳,如果您愿意,可以使用石墨作为您的后备存储。
influxdb {}
和输出插件opentsdb {}
存在并将把您的数据放入真正的时间序列数据库中。
从那里开始,近期数据(距离您的解释有几天的时间)的聚合/汇总应该在查询时完成。类似格拉法纳可以处理多个数据存储,使显示更加容易。一旦您越过了日志到达的风险区,您就可以运行后续的 ETL 流程,根据以下信息生成数据库内聚合/汇总完全的数据集。然后根据需要清除完整详细日志。
简而言之,该方法:
- 使用 Logstash 提取文件。
- 利用过滤从 CDN 日志文件中提取字段。
- 用途过滤
date {}
器将日志的时间戳拉入事件的时间戳中。 - 将数据导出到某些东西(弹性、石墨或其他时间序列数据库)
- 显示工具使用实时聚合查询向消费者显示数据,至少是近期数据。
- 经过一段时间(可能是几天)后,脚本或其他自动化过程会生成聚合并将其输入到数据存储中。
- 经过一段时间后,全分辨率数据将被清除,仅留下聚合数据。