Logstash 创建自定义GROK图案

Logstash 创建自定义GROK图案,logstash,jira,logstash-grok,elk,atlassian-crowd,Logstash,Jira,Logstash Grok,Elk,Atlassian Crowd,目前,我正在尝试为此日志创建一个grok模式 2020-03-11 05:54:26,174 JMXINSTRUMENTS-Threading [{"timestamp":"1583906066","label":"Threading","ObjectName":"java.lang:type\u003dThreading","attributes":[{"name":"CurrentThreadUserTime","value":18600000000},{"name":"ThreadCoun

目前,我正在尝试为此日志创建一个grok模式

2020-03-11 05:54:26,174 JMXINSTRUMENTS-Threading [{"timestamp":"1583906066","label":"Threading","ObjectName":"java.lang:type\u003dThreading","attributes":[{"name":"CurrentThreadUserTime","value":18600000000},{"name":"ThreadCount","value":152},{"name":"TotalStartedThreadCount","value":1138},{"name":"CurrentThreadCpuTime","value":20804323112},{"name":"PeakThreadCount","value":164},{"name":"DaemonThreadCount","value":136}]}]
目前,我可以通过使用以下模式正确匹配JMXInteruments线程:

%{TIMESTAMP_ISO8601:timestamp} (?<instrument>[^\ ]*) ?%{GREEDYDATA:log_message}
%{TIMESTAMP\u ISO8601:TIMESTAMP}(?[^\]*)?%{GREEDYDATA:log\u message}

但我似乎无法匹配这之后的所有值。有人知道我应该使用什么模式吗?

我正在尝试您的模式(这是logstash的官方调试器),它确实在“JMXINTRUMENTS Threading”(JMXINTRUMENTS Threading)之后将所有内容与您的模式匹配在一个名为log message的大字段中,方式如下:

{
  "timestamp": [
    [
      "2020-03-11 05:54:26,174"
    ]
  ],
  "YEAR": [
    [
      "2020"
    ]
  ],
  "MONTHNUM": [
    [
      "03"
    ]
  ],
  "MONTHDAY": [
    [
      "11"
    ]
  ],
  "HOUR": [
    [
      "05",
      null
    ]
  ],
  "MINUTE": [
    [
      "54",
      null
    ]
  ],
  "SECOND": [
    [
      "26,174"
    ]
  ],
  "ISO8601_TIMEZONE": [
    [
      null
    ]
  ],
  "instrument": [
    [
      "JMXINSTRUMENTS-Threading"
    ]
  ],
  "log_message": [
    [
      "[{"timestamp":"1583906066","label":"Threading","ObjectName":"java.lang:type\\u003dThreading","attributes":[{"name":"CurrentThreadUserTime","value":18600000000},{"name":"ThreadCount","value":152},{"name":"TotalStartedThreadCount","value":1138},{"name":"CurrentThreadCpuTime","value":20804323112},{"name":"PeakThreadCount","value":164},{"name":"DaemonThreadCount","value":136}]}]"
    ]
  ]
}
如果您希望匹配日志消息中包含的所有字段,您应该在logstash管道过滤器部分中使用json过滤器,就在grok过滤器的正下方:

例如:

  grok {
     match => { "message" =>"%{TIMESTAMP_ISO8601:timestamp} (?<instrument>[^\ ]*) ?%{GREEDYDATA:log_message}" }
     tag_on_failure => ["no_match"]
  }
  if "no_match" not in [tags] {
    json {
      source => "log_message"
    }
  }
grok{
match=>{“message”=>“%{TIMESTAMP_ISO8601:TIMESTAMP}(?[^\]*)?%{GREEDYDATA:log_message}”
标记故障=>[“无匹配”]
}
如果[标签]中没有“不匹配”{
json{
source=>“日志消息”
}
}
这样,json将在key:value中拆分并解析

编辑:

您可以尝试使用kv过滤器而不是json,文档如下:

grok{
match=>{“message”=>“%{TIMESTAMP_ISO8601:TIMESTAMP}(?[^\]*)?%{GREEDYDATA:log_message}”
标记故障=>[“无匹配”]
}
如果[标签]中没有“不匹配”{
千伏{
source=>“日志消息”
值_split=>“:”
包括括号=>true#删除括号
删除\u char\u key=>“\”
删除\u字符\u值=>“\”
字段_split=>“,”
}
}

在JSON过滤器中定义了不同的源和目标之后,它对我起了作用。谢谢你的帮助

filter {
    if "atlassian-jira-perf" in [tags] {
    grok {
     match => { "message" =>"%{TIMESTAMP_ISO8601:timestamp} (?<instrument>[^\ ]*) ?%{GREEDYDATA:log_message_raw}" }
     tag_on_failure => ["no_match"]
     add_tag => ["bananas"]
  }
  if "no_match" not in [tags] {
    json {
      source => "log_message_raw"
      target => "parsed"
    }
  }
  mutate {    
        remove_field => ["message"]
    }
}
}
过滤器{
如果[tags]中的“atlassian jira perf”{
格罗克{
match=>{“message”=>“%{TIMESTAMP_ISO8601:TIMESTAMP}(?[^\]*)?%{GREEDYDATA:log_message_raw}”
标记故障=>[“无匹配”]
添加标签=>[“香蕉”]
}
如果[标签]中没有“不匹配”{
json{
source=>“日志\消息\原始”
目标=>“已解析”
}
}
变异{
删除_字段=>[“消息”]
}
}
}

目前,我收到一条JSONparsefailure“log\u消息”:“[{”时间戳“:\”158401526\”,\“标签\“:”线程\“,\”对象名称\“:\”java.lang:type\\u003dThreading\”,\“属性\“:[{”名称\“:\”CurrentThreadUserTime\”,\“值\“:2222000000\,{”名称\“:\”线程计数\“,\”,\“值\“:152},{”名称\“:”TotalCount\”,“,”线程计数\“,{1253\”名称\“:\“CurrentThreadCpuTime\”,“value\”:2466771578},{“name\”:“PeakThreadCount\”,\“value\”:164},{“name\”:“DaemonThreadCount\”,\“value\”:136}]}],“[标记]中的过滤器{如果“atlassian jira perf”{grok{match=>{message message message=>“%{TIMESTAMP\u ISO8601:TIMESTAMP(?^\]*):TIMESTAMP=?%{greedyu data=>无匹配消息”[}]如果[tags]{json{source=>“log_message”}}}}中没有“no_match”}我在我的答案中添加了一个编辑,不管怎样,如果您可以分享整个错误,这对调试来说会更好,因为json是有效的,所以json过滤器确实不起作用
filter {
    if "atlassian-jira-perf" in [tags] {
    grok {
     match => { "message" =>"%{TIMESTAMP_ISO8601:timestamp} (?<instrument>[^\ ]*) ?%{GREEDYDATA:log_message_raw}" }
     tag_on_failure => ["no_match"]
     add_tag => ["bananas"]
  }
  if "no_match" not in [tags] {
    json {
      source => "log_message_raw"
      target => "parsed"
    }
  }
  mutate {    
        remove_field => ["message"]
    }
}
}