情况:
- 我每天下午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
我想要的:
- 我不需要一个花哨的进度条来告诉我已经导入了多少数据(针对输入文件)。
- 我只想在“it's done”的时候结束操作,并且在到达EOF或者“finished importing”的时候发送一个
Ctrl + C
。
1条答案
按热度按时间s3fp2yjn1#
对于文件输入,在读取模式下,有一种方法可以在阅读所有文件时退出该过程,只需设置:
input { file { exit_after_read => true } }
https://www.elastic.co/guide/en/logstash/current/plugins-inputs-file.html#plugins-inputs-file-exit_after_read