如何使用Logstash从其他字段截取子串生成新字段
解决Logstash提取log.file.path中服务名的问题
需求回顾
需要从log.file.path字段中解析出服务名,新增my.service字段:
"log.file.path": "/var/log/myservice.log"
"my.service": "myservice"
原配置问题分析
你之前的两个过滤器都存在问题:
- 第一个grok表达式
%{GREEDYDATA}/(?<my.service>).log中,(?<my.service>)未指定匹配规则,无法捕获任何内容; - 第二个grok表达式
%{GREEDYDATA}/%{GREEDYDATA:my.service}.log未对.转义(正则中.匹配任意字符),且GREEDYDATA可能匹配到非预期内容; - 条件判断
if ("" in [log.file.path])逻辑无效,空字符串存在于任何字符串中,该条件始终为真,应改为判断字段是否存在。
正确配置方案
方案1:使用Grok插件
filter { # 仅当log.file.path字段存在时执行解析 if [log.file.path] { grok { match => { "log.file.path" => ".*/%{DATA:my.service}\\.log$" } } } }
.*/匹配路径中最后一个斜杠之前的所有内容;%{DATA:my.service}匹配文件名(非换行符的任意字符);\.log$精准匹配结尾的.log,$确保匹配到路径末尾。
方案2:使用Dissect插件(更简洁)
Dissect无需正则,语法更直观:
filter { if [log.file.path] { dissect { mapping => { "log.file.path" => "%{*}/%{my.service}.log" } } } }
%{*}表示忽略斜杠之前的所有内容;%{my.service}直接提取出.log前的服务名。
内容的提问来源于stack exchange,提问作者Ror
相关产品推荐
相关产品推荐

