ELK新手求助:提取Tomcat日志中transactionId的Logstash Grok过滤器
提取Tomcat日志中transactionId的Logstash Grok解决方案
Hey there! 作为ELK新手,要从你给出的Tomcat日志里提取transactionId并生成独立字段,用Grok过滤器完全可以轻松搞定。咱们先看看你的日志格式:
2018-03-14 10:58:36,853 INFO so:165 - Female Value : 0.084370888769626617 for transactionId ABCsdf62969
第一步:构建Grok匹配模式
针对这种日志,我们可以拆解成几个部分来匹配,重点抓住transactionId后面的取值:
%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:loglevel} %{DATA:class_line} - %{DATA:metric_name} : %{NUMBER:metric_value} for transactionId %{DATA:transactionId}
模式解释:
%{TIMESTAMP_ISO8601:timestamp}:匹配日志开头的时间戳,并存入timestamp字段%{LOGLEVEL:loglevel}:匹配INFO这类日志级别,存入loglevel字段%{DATA:class_line}:匹配so:165这类类名加行号的内容,存入class_line字段%{DATA:metric_name}:匹配Female Value这类指标名称,存入metric_name字段%{NUMBER:metric_value}:匹配后面的浮点数值,存入metric_value字段for transactionId %{DATA:transactionId}:精准匹配for transactionId字符串,然后提取后面的ID值存入transactionId字段
如果你确认transactionId的格式是字母+数字的组合,也可以用%{WORD:transactionId}或者更严格的正则比如%{USERNAME:transactionId}来替代%{DATA},这样匹配会更精准。
第二步:完整的Logstash配置示例
把这个Grok规则放到你的Logstash配置里,大概是这样的:
input { # 这里根据你的实际输入源配置,比如file或者beats file { path => "/path/to/your/tomcat/logs/*.log" start_position => "beginning" } } filter { grok { match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:loglevel} %{DATA:class_line} - %{DATA:metric_name} : %{NUMBER:metric_value} for transactionId %{DATA:transactionId}" } } # 可选:把timestamp字段转成Logstash的@timestamp(如果需要的话) date { match => [ "timestamp", "yyyy-MM-dd HH:mm:ss,SSS" ] target => "@timestamp" } } output { # 输出到Elasticsearch或者其他目标 elasticsearch { hosts => ["localhost:9200"] index => "tomcat-logs-%{+YYYY.MM.dd}" } # 同时输出到控制台方便调试 stdout { codec => rubydebug } }
第三步:测试你的Grok规则
你可以用Logstash自带的测试命令来验证配置是否正确:
bin/logstash --config.test_and_exit -f /path/to/your/config.conf
或者直接启动Logstash,看控制台输出的rubydebug结果里有没有transactionId字段,以及对应的取值是否正确。
如果遇到匹配失败的情况,可以逐步简化Grok模式,先匹配前面的部分,再慢慢加上后面的transactionId部分,这样更容易排查问题。
内容的提问来源于stack exchange,提问作者Ashok Reddy
相关产品推荐
相关产品推荐

