导入所有数据后自动停止Logstash进程

时间:2019-02-21 16:10:22

标签: docker elasticsearch logstash kibana

情况:

  • 我每天晚上12点通过Logstash手动将数据导入Elasticsearch。
  • 我知道Logstash上没有“关闭”,因为理想情况下,您希望将数据连续发送到服务器。
  • 我正在使用elk-docker作为我的ELK堆栈。
  • 我编写了一个shell脚本,该脚本将命令发送到docker容器以执行以下操作:

dailyImport.sh

docker exec -it $DOCKER_CONTAINER_NAME opt/logstash/bin/logstash --path.data /tmp/logstash/data -e \
'input {
    file {
        path => "'$OUTPUT_PATH'"
        start_position => "beginning"
        sincedb_path => "/dev/null"
        mode => "read"
        file_completed_action => "delete"
    }
}
filter {
    csv {
        separator => ","
        columns => ["foo", "bar", "foo2", "bar2"]
    }

}

output {
    elasticsearch{
        hosts => "localhost:9200"
        index => "foo"
        document_type => "foo"
    }
    stdout {}
}'

我尝试并理解的内容:

  • 我已经读到,添加read模式和file_completed_action来删除将停止操作,我尝试了一下,但是没有用。
  • 我仍然需要手动发送Ctrl + C才能停止管道。例如:
^C[2019-02-21T15:49:07,787][WARN ][logstash.runner          ] SIGINT received. Shutting down.
[2019-02-21T15:49:07,899][INFO ][filewatch.observingread  ] QUIT - closing all files and shutting down.
[2019-02-21T15:49:09,764][INFO ][logstash.pipeline        ] Pipeline has terminated {:pipeline_id=>"main", :thread=>"#<Thread:0x6bdb92ea run>"}
Done

我已阅读到可以执行以下操作,但不知道如何做:

  • 监视sincedb文件以检查Logstash何时达到EOF,然后杀死Logstash。
  • 改为使用stdin输入。关闭stdin并处理完所有输入后,Logstash会自行关闭。另一方面,无论您不知道它处理了多少,它的Logstash都会死亡。

参考:https://discuss.elastic.co/t/stop-logstash-after-processing-the-file/84959

我想要的:

  • 我不需要花哨的进度条来告诉我已导入了多少数据(针对输入文件)。
  • 我只想在“完成”后结束操作,并且可能在到达EOF或“完成导入”时发送Ctrl + C

1 个答案:

答案 0 :(得分:1)

对于以读取模式输入文件,最近有一种方法可以在读取所有文件后退出该过程,只需设置:

input { file { exit_after_read => true } }

https://www.elastic.co/guide/en/logstash/current/plugins-inputs-file.html#plugins-inputs-file-exit_after_read