如何从 LogStash 中的消息中提取特定数据

How to pull specific data out of a message in LogStash

我正在尝试从格式明确的自定义应用程序中获取日志数据。我正在尝试使用 grok 过滤器挑选出某些数据,但我没有任何运气。这是一个示例日志:

- System.Data.SqlClient.SqlException (0x80131904): Arithmetic overflow error converting IDENTITY to data type int.
Arithmetic overflow occurred. 

我想做的是从字符串中提取出 SqlException。这是我正在使用的 grok:

grok{
    match => 
          {
               "message" => 
               [
                   "(?m)%{DATE:TIMESTAMP_DATE}%{SPACE}%{TIME:TIMESTAMP_TIME}%{SPACE}%{WORD:LOG_LEVEL}%{SPACE}(?<THREAD>[^\s]+)%{SPACE}(?<HOST>[^\s]+)%{SPACE}%{GREEDYDATA:MESSAGE}",

                   "(?<EXCEPTION>[.*]+)"
               ]
           }
}

我尝试了几种不同的方法,但我想我没有完全理解文档。我希望发生的是我在第一组中提取的所有字段都将包含第二组的结果。也就是说:

TIMESTAMP_DATE,TIMESTAMP_TIME,LOG_LEVEL,THREAD,HOST,MESSAGE,EXCEPTION

我正在完美地获取其他字段,这只是我缺少的额外匹配。任何帮助,将不胜感激。谢谢

如果您指定多个模式,默认情况下 grok 只会检查模式,直到遇到第一个匹配项。如果您想匹配两种模式,而不管第一个模式是否匹配,您可以像这样更改行为:

grok{
      break_on_match => false
      match => 
      {
           "message" => 
           [
               "(?m)%{DATE:TIMESTAMP_DATE}%{SPACE}%{TIME:TIMESTAMP_TIME}%{SPACE}%{WORD:LOG_LEVEL}%{SPACE}(?<THREAD>[^\s]+)%{SPACE}(?<HOST>[^\s]+)%{SPACE}%{GREEDYDATA:MESSAGE}",

               "(?<EXCEPTION>[.*]+)"
           ]
       }
}

查看以下文档:https://www.elastic.co/guide/en/logstash/current/plugins-filters-grok.html#plugins-filters-grok-break_on_match