Ruby 创建可由Logstash解析的组合S3日志文件
我已经编写了一个脚本来持续地将所有S3 bucket日志文件拉到我的Logstash服务器,这样就可以使用中的模式对其进行解析。唉,由于脚本从头开始重新创建日志文件,而不是仅仅附加到日志文件中,因此Logstash的Ruby 创建可由Logstash解析的组合S3日志文件,ruby,logging,amazon-s3,logstash,logstash-grok,Ruby,Logging,Amazon S3,Logstash,Logstash Grok,我已经编写了一个脚本来持续地将所有S3 bucket日志文件拉到我的Logstash服务器,这样就可以使用中的模式对其进行解析。唉,由于脚本从头开始重新创建日志文件,而不是仅仅附加到日志文件中,因此Logstash的文件输入没有看到任何新的更改。有什么想法吗 脚本如下: #!/usr/bin/ruby require 'rubygems' require 'aws/s3' # for non-us buckets, we need to change the endpoint AWS.con
文件
输入没有看到任何新的更改。有什么想法吗
脚本如下:
#!/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
有什么帮助吗?谢谢 我们使用cloudtrail进行审计,并使用带有cloudtrail编解码器的s3输入,该编解码器会自动将实际日志从顶级cloudtrail对象中取出 对于您的用例,您还应该能够使用s3输入来获取实际的日志内容,然后对任何具有该类型的内容操作s3 grok过滤器
编辑:确保在S3输入中使用“备份到bucket”选项,因为它每次都对bucket中的所有内容进行操作,即使它只通过logstash推送最新的日志。我最后将脚本更改为以下内容:
#!/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 }
}
现在工作得非常出色。我有另一个脚本,它可以抓取CloudTrail日志,而且工作得非常好——因为它附加到文件末尾,而不是在每次cron运行时都重新创建它。这会更好,因为如果文件被重写或重新创建,而不是仅仅修改(除非我遗漏了什么),sincedb会感到困惑。唉,由于不同的日志文件前缀结构,这对S3不起作用……我们没有遇到这个问题,但可能只是时间问题。我们也可能不会遇到cloudtrail日志的问题,因为它只是每15分钟一个新文件。虽然看起来您只是从staticassets日志/前缀(这可能只是一个示例)中删除了所有内容,但我想说,多个s3输入将允许您这样做并提高吞吐量(尽管这可能会很痛苦)。