Logstash S3 输入插件重新扫描所有存储桶对象

Logstash S3 输入插件重新扫描所有存储桶对象

我正在使用 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 个重要说明:

  1. 您不能单独使用 backup_add_prefix(文档建议您可以)。您只能将此参数与 backup_to_bucket 结合使用

  2. 确保您用于与 S3 交互的 IAM 帐户/角色对您正在使用的存储桶具有写入权限(其他 Logstash 无法删除/重命名对象)。

相关内容