0

我正在尝试从具有明确定义的格式的自定义应用程序中获取日志数据。我正在尝试使用 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

我完美地获得了其他领域,这只是我缺少的额外匹配。任何帮助,将不胜感激。谢谢

4

1 回答 1

1

如果您指定多个模式,则默认情况下 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

于 2015-10-22T15:28:15.813 回答