如何访问Logstash元数据事件单个字段?JDBC插件报错求助
首先咱们梳理下你的问题:你在用Logstash 7.6搭配output-jdbc插件时触发了执行报错,根源是事件传递了@metadata下的整个字段集合而非单个字段值;但直接使用普通事件字段时运行正常,现在需要明确怎么正确获取@metadata里的单个字段。
从你给出的错误日志来看,JDBC执行UPDATE语句时抛出异常,核心问题就出在@metadata字段的引用方式上。下面给你两种可靠的解决方案:
方案1:修正字符串插值的引用方式
你当前配置里用的"%{[@metadata][miEntidad]}"语法本身是正确的,但可能存在字段名不匹配或者解析问题。首先要确认miEntidad确实存在于@metadata集合中——你可以在output前加一个stdout输出做调试:
output { stdout { codec => rubydebug } jdbc { # 你的JDBC连接配置 statement => ["UPDATE table SET estate = 'A' WHERE entidad = ? ", "%{[@metadata][miEntidad]}"] } }
运行后查看控制台输出的完整事件,确认@metadata里的字段名和你引用的完全一致(Logstash字段是大小写敏感的!)。另外你提到map['entidad_temp'] = event.get('entidad'),如果这里的目标字段是entidad_temp,那你应该引用%{[@metadata][entidad_temp]}而非miEntidad,这点要仔细核对。
方案2:使用Lambda表达式绑定参数(更推荐)
如果字符串插值的方式还是有问题,推荐用parameters选项配合Lambda表达式直接获取字段值,这种方式更精准,也能避免解析异常:
output { jdbc { # 你的JDBC连接配置 statement => "UPDATE table SET estate = 'A' WHERE entidad = :entidad_param" parameters => { "entidad_param" => lambda { |event| event.get("[@metadata][miEntidad]") } } } }
这里通过event.get("[@metadata][miEntidad]")直接从事件中提取@metadata下的单个字段值,传递给JDBC语句的参数entidad_param,完全不会传递整个@metadata集合,能从根源上解决你遇到的问题。
额外注意事项
- 务必注意字段名的大小写和拼写,Logstash对字段名的大小写严格区分,哪怕一个字母大小写错误都无法匹配到字段。
- 绝对不要直接传递整个
@metadata集合给JDBC输出,JDBC仅需要单个参数值,传递集合必然会导致SQL执行异常。
内容的提问来源于stack exchange,提问作者Max

