关闭 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 会继续运行并定期生成这些报告。