0

我编写了一个脚本来不断地将我的所有 S3 存储桶日志文件下拉到我的 Logstash 服务器,因此可以使用此拉取请求中的模式对其进行解析。唉,鉴于脚本从头开始重新创建日志文件,而不是只是附加到它,Logstash 的file输入没有看到任何新的变化。有任何想法吗?

下面的脚本:

#!/usr/bin/ruby

require 'rubygems'
require 'aws/s3'

# for non-us buckets, we need to change the endpoint
AWS.config(:s3_endpoint => "s3-eu-west-1.amazonaws.com")

# connect to S3
s3 = AWS::S3.new(:access_key_id => S3_ACCESS_KEY, :secret_access_key => S3_SECRET_KEY)

# grab the bucket where the logs are stored
bucket = s3.buckets[BUCKET_NAME]

File.open("/var/log/s3_bucket.log", 'w') do |file|

  # grab all the objects in the bucket, can also use a prefix here and limit what S3 returns
  bucket.objects.with_prefix('staticassets-logs/').each do |log|
    log.read do |line|
      file.write(line)
    end
  end
end

有什么帮助吗?谢谢!

4

2 回答 2

1

我最终将脚本更改为以下内容:

#!/bin/bash 
export PATH=$PATH:/bin:/usr/bin
cd /var/log/s3/$S3_BUCKET/
export s3url=s3://$S3_BUCKET/$S3_PREFIX
s3cmd -c /home/logstash/.s3cfg sync --skip-existing $s3url .

...并将其从评估单个日志文件更改为通配整个/var/log/s3/my_bucket目录:

input {
  file {
    type => "s3-access-log"
    path => "/var/log/s3/$S3_BUCKET/$S3_BUCKET/*"
    sincedb_path => "/dev/null"
    start_position => "beginning"
  }
}
filter {
    if [type] == "s3-access-log" {
        grok {
            patterns_dir => ["/etc/logstash/conf.d/patterns"]
            match => { "message" => "%{S3_ACCESS_LOG}" }
            remove_field => ["message"]
        }
        date {
            match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]
            remove_field => ["timestamp"]
        }
    }
}
output {
  elasticsearch { host => localhost }
  stdout { codec => rubydebug }
}

现在工作得很好。

于 2014-10-30T18:16:05.517 回答
0

我们使用 cloudtrail 进行审计,并使用带有 cloudtrail 编解码器的 s3 输入,该编解码器会自动将实际日志从顶部的 cloudtrail 对象中提取出来。

对于您的用例,您还应该能够使用 s3 输入来获取实际的日志内容,然后对具有该类型的任何内容操作您的 S3 grok 过滤器。

编辑:请务必在 S3 输入中使用“备份到存储桶”选项,因为它每次都对存储桶中的所有内容进行操作,即使它仅通过 logstash 推送最新日志。

于 2014-10-30T15:39:56.357 回答