Logstash 6.2.3警告处理:多JDBC输入映射至ES独立索引方案
解决Logstash 6.2.3多JDBC输入映射到独立Elasticsearch索引的问题
嗨,我来帮你搞定这个问题!首先得先理清楚那个警告的意思:ES 6.x及以上版本已经取消了单索引多文档类型(_type)的支持,所以Logstash里的type字段不再用来确定文档的_type了,这就是你看到警告的原因。要实现多JDBC输入对应不同ES索引,我们可以给每个输入加个自定义标记字段,然后在输出里动态匹配索引名就行。
步骤1:给JDBC输入添加自定义标记字段
给每个JDBC输入配置加上add_field属性,用这个字段标记该输入对应的目标索引。比如:
input { # 对应agency索引的JDBC输入 jdbc { jdbc_driver_library => "mysql-connector-java-5.1.44.jar" jdbc_driver_class => "com.mysql.jdbc.Driver" jdbc_connection_string => "jdbc:mysql://localhost:3306/dbname" jdbc_user => "XXXX" jdbc_password => "XXXX" jdbc_paging_enabled => true # 这里记得加上对应agency数据的查询语句,比如query => "SELECT * FROM agency" add_field => { "target_index" => "agency" } # 标记目标索引为agency } # 对应subscriber索引的JDBC输入 jdbc { jdbc_driver_library => "mysql-connector-java-5.1.44.jar" jdbc_driver_class => "com.mysql.jdbc.Driver" jdbc_connection_string => "jdbc:mysql://localhost:3306/dbname" jdbc_user => "XXXX" jdbc_password => "XXXX" jdbc_paging_enabled => true # 这里加上对应subscriber数据的查询语句,比如query => "SELECT * FROM subscriber" add_field => { "target_index" => "subscriber" } # 标记目标索引为subscriber } }
这个add_field会给每个从该JDBC输入生成的事件,额外添加一个target_index字段,用来区分不同的目标索引。
步骤2:配置Elasticsearch输出,动态指定索引
在输出部分,我们用%{target_index}来引用事件里的标记字段值,动态设置目标索引。同时因为ES 6.x默认文档类型是_doc,可以显式指定这个参数来避免不必要的警告:
output { elasticsearch { hosts => ["localhost:9200"] # 你的ES服务地址 index => "%{target_index}" # 动态引用标记字段作为索引名 document_type => "_doc" # ES 6.x+默认的文档类型,建议加上消除警告 # 如果需要指定文档ID,可以加上document_id => "%{your_id_field}",按需配置 } }
这样配置后,第一个JDBC输入的事件会自动写入agency索引,第二个输入的事件会写入subscriber索引,完美满足你的需求,同时也规避了那个关于type字段的警告。
额外小提示
- 如果你的ES版本是7.x及以上,
document_type参数已经被移除,直接删掉这个配置就行,因为7.x彻底取消了文档类型的概念。 - 一定要确保两个JDBC输入的
query语句对应不同的数据源(比如不同的表),这样两个索引的数据才不会混在一起。
内容的提问来源于stack exchange,提问作者Ananda Kumar N C
相关产品推荐
相关产品推荐

