Logstash新手求助:配置Grok过滤日志后管道无法创建
问题修复方案
下面是导致Logstash无法创建管道的几个关键问题,以及修正后的配置:
- Grok匹配语法错误:
match参数的键是字段名,不能用%{log1}包裹,直接写字段名log1即可,%{}是引用字段值的语法,不适合在这里使用。 - 模式冗余括号:Grok模式开头和结尾的括号完全多余,会干扰匹配逻辑,直接删除就行。
- 字段名冲突:你用
time作为提取的字段名,但原始日志里已经有同名的time字段,会覆盖原有数据,建议改成log_time避免冲突。 - 可选优化:添加匹配失败标签方便排查,同时增加字段存在判断,避免空字段引发的无效匹配。
修正后的完整配置:
input { beats { port => 5045 host => "0.0.0.0" } } filter { json { source => "message" add_field => { "log1" => "%{log}" } } # 仅在log1字段存在时执行grok匹配 if [log1] { grok { match => { "log1" => '%{TIME:log_time}\|%{LOGLEVEL:logLevel}\|%{USER:microservice_name}: %{GREEDYDATA:logMessage}' } # 匹配失败时添加标签,便于排查问题 tag_on_failure => ["_grokparsefailure"] } } } output { elasticsearch { hosts => "elasticsearch:9200" user => elastic password => yourstrongpasswordhere index => "pj" } stdout { codec => rubydebug } # 用rubydebug格式输出更易读 }
你可以先用Logstash自带工具单独验证Grok模式是否正确:
echo '11:20:15|INFO|config-app: Starting_thread' | /path/to/logstash/bin/logstash --allow-env -e 'filter { grok { match => { "message" => "%{TIME:log_time}\|%{LOGLEVEL:logLevel}\|%{USER:microservice_name}: %{GREEDYDATA:logMessage}" } } } output { stdout { codec => rubydebug } }'
如果能正确解析出字段,说明模式没问题,再放到配置文件中使用即可。
内容的提问来源于stack exchange,提问作者eshita
相关产品推荐
相关产品推荐

