从AWS SQS和AWS S3中的批存储接收消息的Logstash替代方案

从AWS SQS和AWS S3中的批存储接收消息的Logstash替代方案,logstash,amazon-sqs,audit-logging,audit-trail,Logstash,Amazon Sqs,Audit Logging,Audit Trail,我需要能够将日志作为批存储在AWS S3中,作为针对JSON SerDe适当格式化的文本文件 一个批处理日志文件在S3上的外观示例,日期时间格式为yyyy-MM-dd HH:MM:ss {"message":"Message number 1","datetime":"2020-12-01 14:37:00"} {"message":"Message number 2",&qu

我需要能够将日志作为批存储在AWS S3中,作为针对JSON SerDe适当格式化的文本文件

一个批处理日志文件在S3上的外观示例,日期时间格式为
yyyy-MM-dd HH:MM:ss

{"message":"Message number 1","datetime":"2020-12-01 14:37:00"}
{"message":"Message number 2","datetime":"2020-12-01 14:38:00"}
{"message":"Message number 3","datetime":"2020-12-01 14:39:00"}
理想情况下,这些存储在S3上,每5秒存储一次,或者当排队消息达到50时存储,但也可以配置


我几乎成功地使用了Logstash,并使用了下面的配置

input {
  sqs {
    endpoint => "AWS_SQS_ENDPOINT"
    queue => "logs"
  }
}

output {
   s3 {
     access_key_id => "AWS_ACCESS_KEY_ID"
     secret_access_key => "AWS_SECRET_ACCESS_KEY"
     region => "AWS_REGION"
     bucket => "AWS_BUCKET"
     prefix => "audit/year=%{+YYYY}/month=%{+MM}/day=%{+dd}/"
     size_file => 128
     time_file => 5
     codec => "json_lines"
     encoding => "gzip"
     canned_acl => "private"
   }
}
问题是S3输出插件需要
@timestamp
字段,该字段与我们的查询工具不兼容。如果使用mutate过滤器删除@timestamp或更改为datetime,那么它将不会处理日志。我们不能为每个记录存储datetime字段和@timestamp,因为这会大大增加我们需要存储的数据量(数百万日志)

是否有其他软件可用于实现此结果


由于[Badger]的原因,更新的配置正在使用Logstash[https://stackoverflow.com/users/11792977/badger]

input {
  sqs {
    endpoint => "http://AWS_SQS_ENDPOINT"
    queue => "logs"
  }
}

filter {
  mutate {
    add_field => {
      "[@metadata][year]" => "%{+YYYY}"
      "[@metadata][month]" => "%{+MM}"
      "[@metadata][day]" => "%{+dd}"
    }
    remove_field => [ "@timestamp" ]
  }
}

output {
   s3 {
     access_key_id => "AWS_ACCESS_KEY_ID"
     secret_access_key => "AWS_SECRET_ACCESS_KEY"
     region => "AWS_REGION"
     bucket => "AWS_BUCKET"
     prefix => "audit/year=%{[@metadata][year]}/month=%{[@metadata][month]}/day=%{[@metadata][day]}"
     # 1 MB
     size_file => 1024
     # 1 Minute
     time_file => 1
     codec => "json_lines"
     encoding => "gzip"
     canned_acl => "private"
   }
}

我在s3输出代码中看不到对@timestamp的任何依赖。您已经在
前缀=>“audit/year=%{+YYYY}/month=%{+MM}/day=%{+dd}/”
中使用sprintf引用创建了一个。您可以将这些sprintf引用移动到mutate+add_字段过滤器,该过滤器将字段添加到[@metadata],然后删除@timestamp,然后引用前缀选项中的[@metadata]字段。

太棒了,我不知道@metadata看起来工作得很好!谢谢我会在上面为其他任何遇到此问题的人添加更新的配置。你最终使用了这个@Nick吗?它看起来可靠吗?它还没有投入生产,但似乎工作得很好。