Logstash输出JSON到文件时多余字段删除失效问题咨询
配置问题排查
你的配置删字段不生效、输出不符合预期,是3个核心错误导致的:
remove_field语法写错:删除字段时直接填字段名即可,不需要加%{}占位符。你写的%{@version}这类格式,Logstash会解析为「删除名称等于@version字段值的字段」,完全匹配不到你要删的元字段,自然删不掉。- 过滤逻辑顺序颠倒:你把
_grokparsefailure的丢弃判断写在了grok匹配之前,而_grokparsefailure标签是grok匹配失败才会生成的,执行判断时标签还不存在,解析失败的脏数据根本不会被丢弃。 - 字段清理不彻底+输出格式不规范:你只列了5个要删除的字段,但file输入、grok匹配还会生成
message、path、host、tags等默认字段,就算删字段写法正确也会残留;同时手写拼接JSON的方式没有做特殊字符转义,一旦日志内容包含引号、换行,输出的就是非法JSON。
修正方案
推荐用prune过滤器做字段白名单,只保留你需要的3个字段,不用逐个列要删除的字段,避免漏删;输出调整顺序保证逻辑生效,调整后的完整配置如下:
input { file { path => "/path/to/log" type => "tomcat" start_position => "beginning" codec => multiline { pattern => "^P50\s+:\s+[0-9]{4}-[0-9]{2}-[0-9]{1,2}\s+[0-9]{1,2}:[0-9]{2}:[0-9]{2}" negate => true what => "previous" } } } filter { # 先执行grok匹配生成字段和标签 grok { match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:level} %{GREEDYDATA:details}" } } # 标签生成后再判断丢弃解析失败的日志 if "_grokparsefailure" in [tags] { drop { } } # 白名单模式仅保留需要的3个字段,其余所有字段自动清除 prune { whitelist_names => ["timestamp", "level", "details"] } } output { file { path => "/out.log" file_mode => 0644 # 按要求输出每行带逗号的JSON格式 codec => line { format => '{"timestamp": "%{timestamp}", "level": "%{level}", "details": "%{details}"},' } } }
补充说明:如果你的
details字段内容包含双引号、换行符这类特殊字符,上面手写拼接的方式会出现JSON格式错误,这种情况建议在filter层提前用json_encode过滤器对字段做转义,或者直接去掉行尾逗号的非标准要求,改用codec => json_lines输出标准JSON行格式,稳定性更高。
内容的提问来源于stack exchange,提问作者user2175783
相关产品推荐
相关产品推荐

