exec-input中的Logstash错误处理

时间:2016-03-07 14:58:59

标签: logstash

如何在输入中执行脚本时检测错误和非零退出代码,例如exec-input?

我使用logstash执行各种任务,例如通过调用shell或返回一些指标的python脚本进行节点监视。但是,脚本有时会失败,通常使用退出代码1。

问题是Logstash只是忽略了失败,因此失败的命令被忽视了。

有什么方法可以以某种方式拦截故障,至少记录错误?

简单案例:

$ cat myexit.sh
#!/bin/bash
exit 1


$ logstash -e 'input { exec { command => "./myexit.sh"  interval=> 10 } } output { stdout {} }' -v
Settings: Default pipeline workers: 1
Registering Exec Input {:type=>nil, :command=>"./myexit.sh", :interval=>10, :level=>:info}
Starting pipeline {:id=>"base", :pipeline_workers=>1, :batch_size=>125, :batch_delay=>5, :max_inflight=>125, :level=>:info}
Pipeline started {:level=>:info}
Logstash startup completed
Running exec {:command=>"./myexit.sh", :level=>:info}
Command completed {:command=>"./myexit.sh", :duration=>0.038, :level=>:info}
2016-03-07T15:05:12.401Z 6755322742e7

没有出现错误的迹象......

2 个答案:

答案 0 :(得分:0)

从我在the code中看到的,exec {}读取脚本的输出,直到管道关闭。唯一的错误处理是如果ruby代码中的某些内容抛出错误或异常。

您应该打开an issue以请求此功能。

答案 1 :(得分:0)

我的解决方案是让脚本写入stderr:

$cat myexit.sh
#!/bin/bash

echo "THIS IS TEXT SENT TO STDOUT"
>&2 echo "THIS IS TEXT SENT TO STDERR"

然后在启动logstash时,脚本的stderr将位于logstash的标准输出中:

logstash agent -e 'input { exec { command => "myexit.sh"  interval=> 10 } } \
 output {  null { }}' -v -l /config-dir/out.log  > out.stdout

标准输出:

$ cat out.stdout
Sending logstash logs to /config-dir/out.log.
THIS IS TEXT SENT TO STDERR

然而,以某种方式访问​​脚本的退出代码会很不错,但我现在可以不用它了。

我已经将logstash作为服务安装,每次启动时都会覆盖stdout-logs,所以我打算创建一个logstash-conf,它将logstash的日志发送到一个合适的地方,但这是另一个故事