Logstash继续执行s3输入任务,但是nerver发送输出事件

时间:2017-01-13 10:00:51

标签: elasticsearch amazon-s3 logstash

我的logstash s3 iinput存在问题。我在kibana iinterface中看到的最后消息来自几天前实际上我有一个带有日志启用的AWS elb。我已经从命令行测试过,我可以看到logsstash不断处理输入,而且从不输出。在elb s3存储桶中,每天/每月/每年有一个文件夹,每个文件夹包含几个日志文件,总大小为60GB。

它在开始时工作正常,但随着日志的增长,它变得缓慢,现在我看到我的日志在outpiut大小。 Logstah一直在做输入任务,过滤,从不输出日志。

我创建了一个专用的测试配置文件,只有s3作为输入,并在命令行的专用机器上进行测试:

/opt/logstash/bin/logstash agent -f /tmp/s3.conf  --debug  2>&1 | tee  /tmp/logstash.log
```
the s3.conf file :
```
admin@ip-10-3-27-129:~$ cat /tmp/s3.conf 
# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
# !!!!!!!!!  This file is managed by SALT  !!!!!!!!!
# !!!!!!!!!    All changes will be lost    !!!!!!!!!
# !!!!!!!!!     DO NOT EDIT MANUALLY !     !!!!!!!!!
# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

#--[ INPUT ]----------------------------------------------------------------
input
{

  # Logs ELB API
  s3
  {
    bucket => "s3.prod.elb.logs.eu-west-1.mydomain"
    prefix => "rtb/smaato/AWSLogs/653589716289/elasticloadbalancing/"
    interval => 30
    region => "eu-west-1"
    type => "elb_access_log"
  }

}



#--[ FILTER ]---------------------------------------------------------------
filter
{

    # Set the HTTP request time to @timestamp field
    date {
      match => [ "timestamp", "ISO8601" ]
      remove_field => [ "timestamp" ]
    }


  # Parse the ELB access logs
  if [type] == "elb_access_log" {
    grok {
      match => [ "message", "%{TIMESTAMP_ISO8601:timestamp:date} %{HOSTNAME:loadbalancer} %{IP:client_ip}:%{POSINT:client_port:int} (?:%{IP:backend_ip}:%{POSINT:backend_port:int}|-) %{NUMBER:request_processing_time:float} %{NUMBER:backend_processing_time:float} %{NUMBER:response_processing_time:float} %{INT:backend_status_code:int} %{INT:received_bytes:int} %{INT:sent_bytes:int} %{INT:sent_bytes_ack:int} \"%{WORD:http_method} %{URI:url_asked} HTTP/%{NUMBER:http_version}\" \"%{GREEDYDATA:user_agent}\" %{NOTSPACE:ssl_cipher} %{NOTSPACE:ssl_protocol}" ]
      remove_field => [ "message" ]
    }

    kv {
      field_split => "&?"
      source => "url_asked"
    }

    date {
      match => [ "timestamp", "ISO8601" ]
      remove_field => [ "timestamp" ]
    }
  }

  # Remove the filebeat input tag
  mutate {
    remove_tag => [ "beats_input_codec_plain_applied" ]
  }

  # Remove field tags if empty
  if [tags] == [] {
    mutate {
      remove_field => [ "tags" ]
    }
  }

  # Remove some unnecessary fields to make Kibana cleaner
  mutate {
    remove_field => [ "@version", "count", "fields", "input_type", "offset", "[beat][hostname]", "[beat][name]", "[beat]" ]
  }

}

#--[ OUTPUT ]---------------------------------------------------------------
output
#{
#  elasticsearch {
#    hosts => ["10.3.16.75:9200"]
#  }
#}
{
#   file {
 #     path => "/tmp/logastash/elb/elb_logs.json"
 #  }
 stdout { codec => rubydebug }
}

我可以看到输入处理,过滤器和“将启动输出工作者......”但不接收输出事件的消息,从不。

我在存储桶上创建了一个新文件夹(名为 test_elb ),并将日志文件夹(例如 31/12/2016 )中的日志复制到其中,然后在我的输入配置中设置新创建的前缀,如下所示:

 s3
  {
    bucket => "s3.prod.elb.logs.eu-west-1.mydomain"
    prefix => "rtb/smaato/AWSLogs/653589716289/test_elb/"
    interval => 30
    region => "eu-west-1"
    type => "elb_access_log"
  }

使用s3前缀,logstash按预期执行所有管道处理(输入,过滤,输出),并且我看到了我的日志输出。 所以对我而言,看起来像是大而且 losgstash-s3 插件很难处理它。 请问有人在这方面提出建议吗?

我的logstash版本: 2.2.4 操作系统: Debian Jessie

我在discussion.elastic论坛中,在弹性IRC陈中搜索并询问,并没有真正的解决方案。 你认为这可能是一个桶大小的问题

感谢您的帮助。

问候。

2 个答案:

答案 0 :(得分:0)

  1. 配置s3输入插件,将文件移动到处理后输入中未考虑的存储桶/路径。
  2. 虽然输入存储桶/路径中有许多文件,但您可能需要对数据的子集运行logstash,直到将文件移动到处理存储桶/路径为止。
  3. 这就是我每天处理大约.5GiB(数十万)个文件的过程。 Logstash将在执行任何插入之前拉出所有对象名称,因此如果您的存储桶中有大量文件,则会显示该进程被卡住。

        bucket => "BUCKET_NAME"
        prefix => "logs/2017/09/01"
        backup_add_prefix => "sent-to-logstash-"
        backup_to_bucket => "BUCKET_NAME"
        interval => 120
        delete => true
    

    我不确定进程对于数据丢失之间的数据丢失有多么持久,但对于不是关键任务的日志,考虑到要移动的文件数量,此过程非常高效

答案 1 :(得分:0)

此行为由watch_for_new_files参数控制。在默认的true中,设置logstash不会处理现有文件,而是等待新文件到达。

示例:

input {
 s3
  {
    bucket => "the-bucket-name"
    prefix => "the_path/ends_with_the_slash/"
    interval => 30
    region => "eu-west-1"
    type => "elb_access_log"
    watch_for_new_files => false
  }
}
output {
  stdout{}
}