我的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陈中搜索并询问,并没有真正的解决方案。 你认为这可能是一个桶大小的问题
感谢您的帮助。
问候。
答案 0 :(得分:0)
这就是我每天处理大约.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{}
}