我正在使用Logstash S3 Input插件来处理S3访问日志。
访问日志全部存储在一个桶中,其中有成千上万个。 我已经build立了插件,只包含具有特定前缀的S3对象(基于date,如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"}
即
每隔一分钟(或者您设置的任何时间间隔),Logstash会从存储桶的开始处开始,并为其find的每个对象进行AWS API调用。 它似乎这样做是为了找出对象的最后修改时间是什么,以便它可以包含相关的文件进行分析。 这显然减慢了一切,并没有给我实时的访问日志分析。
除了不断更新前缀以仅匹配最近的文件,有没有办法使Logstash跳过阅读旧的S3对象?
这个插件有一个sincedb_path参数,但是这似乎只涉及到最后分析哪个文件的数据被写入的地方。
这似乎是这个插件的默认行为,所以它必须使用插件function进行pipe理。
基本上,你必须设置插件来备份,然后删除具有前缀的对象到同一个桶。 这样,Logstash会在下一个时间间隔后轮询桶时跳过对象。
示例configuration:
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 }
这个configuration会以120秒为对象扫描桶
2016-
它将处理这些对象,然后将它们备份到具有前缀的同一个存储桶中
logstash-
然后删除它们。
这意味着它们将不会在下一个轮询间隔中find。
2个重要说明:
你不能自己使用backup_add_prefix(文档build议你可以)。 您只能将此参数与backup_to_bucket结合使用
确保您用于与S3接口的IAM帐户/angular色具有您正在使用的存储桶的写入权限(其他Logstash不能删除/重命名对象)。