关闭 Logstash

编辑

如果将 Logstash 作为服务运行,请使用以下命令之一停止它

  • 在 systemd 上,使用

    systemctl stop logstash

如果您在 POSIX 系统的控制台中直接运行 Logstash,您可以通过向 Logstash 进程发送 SIGTERM 信号来停止它。例如

kill -TERM {logstash_pid}

或者,在控制台中输入 Ctrl-C

受控关闭期间会发生什么?

编辑

当您尝试关闭正在运行的 Logstash 实例时,Logstash 必须先执行几个步骤才能安全关闭。它必须

  • 停止所有输入、过滤器和输出插件
  • 处理所有正在处理中的事件
  • 终止 Logstash 进程

以下情况会影响关闭过程

  • 输入插件以慢速接收数据。
  • 一个慢速过滤器,例如执行 sleep(10000) 的 Ruby 过滤器,或者执行非常繁重查询的 Elasticsearch 过滤器。
  • 一个断开连接的输出插件正在等待重新连接以刷新正在处理中的事件。

这些情况使得关闭过程的持续时间和成功与否变得不可预测。

Logstash 具有一种停滞检测机制,可在关闭期间分析管道和插件的行为。此机制会定期生成有关内部队列中正在处理的事件计数以及繁忙工作线程列表的信息。

要使 Logstash 在关闭停滞的情况下强制终止,请在启动 Logstash 时使用 --pipeline.unsafe_shutdown 标志。

不安全的关闭、强制终止 Logstash 进程或由于任何其他原因导致 Logstash 进程崩溃可能会导致数据丢失(除非您已启用 Logstash 使用 持久队列)。尽可能安全地关闭 Logstash。

停滞检测示例

编辑

在此示例中,慢速过滤器执行阻止管道执行干净的关闭。由于 Logstash 是使用 --pipeline.unsafe_shutdown 标志启动的,因此关闭会导致 20 个事件丢失。

bin/logstash -e 'input { generator { } } filter { ruby { code => "sleep 10000" } }
  output { stdout { codec => dots } }' -w 1 --pipeline.unsafe_shutdown
Pipeline main started
^CSIGINT received. Shutting down the agent. {:level=>:warn}
stopping pipeline {:id=>"main", :level=>:warn}
Received shutdown signal, but pipeline is still waiting for in-flight events
to be processed. Sending another ^C will force quit Logstash, but this may cause
data loss. {:level=>:warn}
{"inflight_count"=>125, "stalling_thread_info"=>{["LogStash::Filters::Ruby",
{"code"=>"sleep 10000"}]=>[{"thread_id"=>19, "name"=>"[main]>worker0",
"current_call"=>"(ruby filter code):1:in `sleep'"}]}} {:level=>:warn}
The shutdown process appears to be stalled due to busy or blocked plugins.
Check the logs for more information. {:level=>:error}
{"inflight_count"=>125, "stalling_thread_info"=>{["LogStash::Filters::Ruby",
{"code"=>"sleep 10000"}]=>[{"thread_id"=>19, "name"=>"[main]>worker0",
"current_call"=>"(ruby filter code):1:in `sleep'"}]}} {:level=>:warn}
{"inflight_count"=>125, "stalling_thread_info"=>{["LogStash::Filters::Ruby",
{"code"=>"sleep 10000"}]=>[{"thread_id"=>19, "name"=>"[main]>worker0",
"current_call"=>"(ruby filter code):1:in `sleep'"}]}} {:level=>:warn}
Forcefully quitting logstash.. {:level=>:fatal}

当未启用 --pipeline.unsafe_shutdown 时,Logstash 将继续运行并定期生成这些报告。