我正在使用 Logstash S3 Input 插件来处理 S3 访问日志。
访问日志全部存储在一个存储桶中,数量有数千个。我已将插件设置为仅包含具有特定前缀的 S3 对象(基于日期,例如 2016-06)。
但是,我可以看到 Logstash 正在重新轮询 Bucket 中的每个对象,并且不考虑它之前分析过的对象。
{:timestamp=>"2016-06-21T08:50:51.311000+0000", :message=>"S3 input: Found key", :key=>"2016-06-01-15-21-10-178896183CF6CEBB", :level=>:debug, :file=>"logstash/inputs/s3.rb", :line=>"111", :method=>"list_new_files"}
IE
每分钟(或您设置的任何间隔)Logstash 都会从存储桶的开头开始,并针对找到的每个对象进行 AWS API 调用。它这样做似乎是为了找出对象的最后修改时间,以便可以包含相关文件进行分析。这显然会减慢一切速度,并且无法让我实时分析访问日志。
除了不断更新前缀以仅匹配最近的文件之外,还有其他方法可以让 Logstash 跳过读取旧的 S3 对象吗?
该插件有一个 sincedb_path 参数,但它似乎只与上次分析文件的数据写入位置有关。
答案1
这似乎是该插件的默认行为,因此必须使用插件功能进行管理。
基本上,您必须设置插件以备份然后删除带有相同存储桶前缀的对象。这样,Logstash 将在下一个间隔后轮询存储桶时跳过对象。
示例配置:
s3 {
bucket => "s3-access-logs-eu-west-1"
type => "s3-access"
prefix => "2016-"
region => "eu-west-1"
sincedb_path => "/tmp/last-s3-file-s3-access-logs-eu-west-1"
backup_add_prefix => "logstash-"
backup_to_bucket => "s3-access-logs-eu-west-1"
interval => 120
delete => true
}
此配置将每 120 秒扫描一次存储桶,查找以以下名称开头的对象:
2016-
它将处理这些对象,然后将它们备份到具有前缀的同一存储桶中
logstash-
然后删除它们。
这意味着在下一个轮询间隔内将找不到它们。
2 个重要说明:
您不能单独使用 backup_add_prefix(文档建议您可以)。您只能将此参数与 backup_to_bucket 结合使用
确保您用于与 S3 交互的 IAM 帐户/角色对您正在使用的存储桶具有写入权限(其他 Logstash 无法删除/重命名对象)。