如何用Grok Filter筛选格式化带***标记的应用日志并导入Kibana?
如何用Grok Filter处理带标记的应用日志并导入Kibana?
针对你的需求,我来帮你一步步实现这个日志处理流程,用Logstash的Grok Filter结合条件判断就能搞定,具体步骤如下:
1. 先筛选目标日志行
首先我们要过滤掉所有不带***标记的日志,只保留需要处理的行。在Logstash的filter块里用条件判断实现:
if "***" not in [message] { drop {} # 直接丢弃无关日志行,减少不必要的处理 }
2. 编写Grok模式解析字段
观察你的日志示例,带***的行分两种类型:带主叫/被叫号码的Answer call行,以及无号码的Hangup call行。我们需要分别编写Grok模式来匹配这两种情况,精准提取你需要的字段:
完整的Filter配置
filter { # 第一步:过滤掉不带***的日志 if "***" not in [message] { drop {} } else { # 第二步:用Grok解析日志字段 grok { match => { "message" => [ # 匹配带号码的Answer call日志,提取所有目标字段 "%{TIMESTAMP_ISO8601:Logtimestamp} %{NUMBER:Channel_id:int} :Answer call from %{NUMBER:Source_number} for %{NUMBER:Destination_Number} %{GREEDYDATA}***", # 匹配Hangup call日志,仅提取时间和Channel_id "%{TIMESTAMP_ISO8601:Logtimestamp} %{NUMBER:Channel_id:int} :Hangup call ***" ] } # 可选:移除原始message字段,减少数据冗余 remove_field => ["message"] } # 可选:给无号码的日志行设置默认值(避免Kibana中字段缺失) if ![Source_number] { mutate { add_field => { "Source_number" => "N/A" "Destination_Number" => "N/A" } } } # 关键:将提取的Logtimestamp转换为Kibana默认识别的时间字段@timestamp date { match => ["Logtimestamp", "yyyy-MM-dd HH:mm:ss"] target => "@timestamp" } } }
配置细节说明
- Grok模式拆解:
%{TIMESTAMP_ISO8601:Logtimestamp}:匹配标准时间格式,映射到Logtimestamp字段%{NUMBER:Channel_id:int}:匹配数字类型的Channel ID,并指定为整数类型(方便后续聚合分析)%{NUMBER:Source_number}和%{NUMBER:Destination_Number}:精准提取主叫和被叫号码%{GREEDYDATA}:匹配日志中号码到***之间的任意内容(比如路径信息),确保不会因为额外内容导致匹配失败
- 日期转换:Kibana默认使用
@timestamp字段作为时间轴,所以用date插件把我们提取的Logtimestamp转成这个字段,方便后续做时间范围筛选 - 默认值处理:对于
Hangup call这类无号码的行,用mutate插件给缺失的字段设置默认值N/A,避免Kibana中出现字段缺失的情况
3. 测试配置正确性
在启动Logstash之前,建议先测试配置的语法和匹配效果:
bin/logstash -f your_config_file.conf --config.test_and_exit
也可以用Logstash自带的Grok调试界面,单独验证你的Grok模式是否能正确匹配目标日志行。
4. 导入到Kibana
配置好Logstash的output块(输出到你的Elasticsearch集群),启动Logstash后,在Kibana中创建对应的索引模式,就能看到结构化的日志数据了——你可以直接按Logtimestamp、Channel_id等字段进行筛选、聚合和分析。
内容的提问来源于stack exchange,提问作者Parth Gandhi
相关产品推荐
相关产品推荐

