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

Ans*_*n C 6 elasticsearch logstash docker kibana

情况:

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

每日导入.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 {}
}'
Run Code Online (Sandbox Code Playgroud)

我尝试并理解的内容:

  • 我读过添加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

Run Code Online (Sandbox Code Playgroud)

我读过我可以执行以下操作,但不知道如何:

  • 监视sincedb 文件以检查Logstash 何时达到EOF,然后杀死Logstash。
  • 请改用 stdin 输入。当标准输入已关闭且所有输入均已处理后,Logstash 将自行关闭。另一方面,Logstash 会因任何您不知道它处理了多少的原因而消亡。

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

我想要的是:

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

kar*_*res 4

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

input { file { exit_after_read => true } }

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