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

问题描述 投票:0回答:2

情况:

  • 我每天中午 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 关闭且所有输入均已处理后,Logstash 将自行关闭。另一方面,Logstash 会因为某种原因而死掉,你不知道它处理了多少数据。

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

我想要的:

  • 我不需要一个花哨的进度条来告诉我已经导入了多少数据(相对于输入文件)。
  • 我只想在“完成”时结束操作,并且可能在到达 EOF 或“完成导入”时发送
    Ctrl + C
docker elasticsearch logstash kibana
2个回答
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


0
投票

如何在

dailyImport.sh
的输出中运行一个脚本,不断检查 Elasticsearch 中的预期数据,然后在完成后终止 Logstash 进程?

不太优雅,但就我而言就足够了。

if curl 'http://eslasticsearch:9200/index/_count | grep -q "count: 100"; then #Kill Logstash service so container would stop kill $(ps aux | grep 'logstash' | awk '{print $2}') break else echo "Counting documents from Elasticsearch does not return the expected number. Retrying" sleep 2 fi
    
© www.soinside.com 2019 - 2024. All rights reserved.