logstash一个实例运行多个配置文件,将所有配置文件放到以下目录即可
/usr/share/logstash/pipeline
但是默认行为不是每个配置文件独立运行,而是作为一个整体,每个input会匹配所有的filter,然后匹配所有的output,可能会导致数据被错误的处理以及发送到错误的地方;
解决方法一:
在input中设置一个变量,在filter和output中判断该变量,实现每个配置文件独立运行,不会相互影响,使用哪个变量呢?
input默认有很多通用参数,但是只有type可用,官方描述如下:
Add a
type
field to all events handled by this input.Types are used mainly for filter activation.
The type is stored as part of the event itself, so you can also use the type to search for it in Kibana.
input中的type参数会被添加到event中,所以后续在filter和output中都可以使用,其他参数就不行了,配置如下:
input {
jdbc {
...
type => "some_type"
}
}
filter {
if [type] == "some_type" {
...
}
}
output {
if [type] == "some_type" {
...
}
}
如果一切正常,恭喜你,如果还有问题,有可能是你的event里本来就有type字段,然后又赋值一个,会出现一个type数组(追加而不是覆盖),这时有两个问题:
1)filter和output中的if判断失效,你的数据压根就不会处理也不会发送出去;
2)你的数据中的type字段被改乱了;
解决方法二:
在event中手工添加一个变量,比如my_type,配置如下:
input {
jdbc {
...
statement => "select *, 'some_type' my_type from my_table where update_time > :sql_last_value"
...
}
}
filter {
if [my_type] == "some_type" {
...
}
}
output {
if [my_type] == "some_type" {
...
}
}
还有其他解决方法详见下边引用的官方文档,包括各种if判断以及@metadata变量的使用;
参考:
jdbc input
https://www.elastic.co/guide/en/logstash/6.3/plugins-inputs-jdbc.html
event dependent configuration
https://www.elastic.co/guide/en/logstash/6.7/event-dependent-configuration.html