如果日志包含特定单词

时间:2018-05-14 03:35:44

标签: logstash elastic-stack logstash-grok

我有一个来自spring日志文件的日志文件。日志文件有三种格式。前两种格式中的每一种都是单行,如果有关键字app-info,则它们之间是一行,它是由自己的开发者打印的消息。如果不是,则由弹簧框架打印。我们可能会将开发人员的消息视为与spring框架不同。第三种格式是多行堆栈跟踪。

我们有自己格式的示例,例如

2018-04-27 10:42:49 [http-nio-8088-exec-1] - INFO  - app-info - injectip ip 192.168.16.89

以上一行有app-info个关键作品,因此是我们自己的开发者'。

2018-04-27 10:42:23 [RMI TCP Connection(10)-127.0.0.1] - INFO  - org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] - Initializing Spring FrameworkServlet 'dispatcherServlet'

以上行没有app-info关键字,因此它由spring框架打印。

在我的Grok过滤器中,第一个模式用于从spring框架打印的消息,第二个模式用于开发人员'消息,第三种格式用于多行堆栈跟踪。我想首先正则表达式清楚地提到spring框架模式没有关键字app-info,因此它可以获得paserexception并遵循开发人员自己的格式的第二个模式。所以我在regex tool中有以下格式,但是我遇到了编译错误。我的正则表达式如下:

(?<timestamp>[\d\-\s\:]+)\s\[(?<threadname>[\d\.\w\s\(\)\-]+)\]\s-\s(?<loglevel>[\w]+)\s+-\s+(?<systemmsg>[^((?app-info).)*\s\.\w\-\'\:\d\[\]\/]+)

因为在Grok过滤器中,我使用来自this link

的指令
filter {
   grok {
     match => [ "message", "PATTERN1", "PATTERN2" , "PATTERN3" ]
    }
}

我在logstash中的当前配置如下,其中没有在模式中清楚地提及app-info:

filter {
  grok {
    match => [
      "message",
        '(?<timestamp>[\d\-\s\:]+)\s\[(?<threadname>[\d\.\w\s\(\)\-]+)\]\s-\s(?<loglevel>[\w]+)\s+-\s+(?<systemmsg>[\s\.\w\-\'\:\d\[\]\/^[app-info]]+)',
        '(?<timestamp>[\d\-\s\:]+)\s\[(?<threadname>[\d\.\w\s\(\)\-]+)\]\s-\s(?<loglevel>[\w]+)\s+-\s(?<appinfo>app-info)\s-\s(?<systemmsg>[\w\d\:\{\}\,\-\(\)\s\"]+)',
        '(?<timestamp>[\d\-\s\:]+)\s\[(?<threadname>[\w\-\d]+)\]\s-\s(?<loglevel>[\w]+)\s\-\s(?<appinfo>app-info)\s-\s(?<params>params):(?<jsonstr>[\"\w\d\,\:\.\{\}]+)\s(?<exceptionname>[\w\d\.]+Exception):\s(?<exceptiondetail>[\w\d\.]+)\n\t(?<extralines>at[\s\w\.\d\~\?\n\t\(\)\_\[\]\/\:\-]+)\n\d'

    ]      
  }

}

使用上述logstash配置中的格式,使用

进行处理时
2018-04-27 10:42:49 [http-nio-8088-exec-1] - INFO  - app-info - injectip ip 192.168.16.89

第一个模式(spring框架模式)已经可以工作,所以它不属于我们自己的开发人员格式的第二个模式。解析器已成功解析如下:

  {
  "timestamp": [
    [
      "2018-04-27 10:42:49"
    ]
  ],
  "threadname": [
    [
      "http-nio-8088-exec-1"
    ]
  ],
  "loglevel": [
    [
      "INFO"
    ]
  ],
  "systemmsg": [
    [
      "app-info - injectip ip 192.168.16.89\n\n"
    ]
  ]
}

我可以让第一个模式的任何提示清楚地提到systemmsg不应包含关键词&#34; app-info&#34;?

修改

我的目标是,如果没有关键字app-info,我让模式1来处理日志。如果有关键字app-info,我让模式2来处理日志。

使用以下日志,其中不包含关键字app-info(模式1可以使用),

2018-04-27 10:42:23 [RMI TCP Connection(10)-127.0.0.1] - INFO  - org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] - Initializing Spring FrameworkServlet 'dispatcherServlet'

我得到以下结果与您的建议后修改的第一个模式不匹配,这不是我的目标。

(?<timestamp>[\d\-\s\:]+)\s\[(?<threadname>[\d\.\w\s\(\)\-]+)\]\s-\s(?<loglevel>[\w]+)\s+-\s+(?<systemmsg>[^(?:(?!app\-info).)*\s\.\w\-\'\:\d\[\]\/]+)

demo。我的目标是提取时间戳,线程名称,日志级别和系统消息。但第一种模式并没有给我预期的结果。该工具说没有匹配。

如果我删除^(?:(?!app-info)。)*,则上面的日志(没有关键字app-info)解析器工作。见demo 但现在,它也适用于包含关键词app-info的日志,这是不可取的,因为现在我想提取时间戳,threadname,loglevel,app-info(是否存在)(该字段应被提取或分组),然后是systemmsg。期望是第一个解析器返回错误,让第二个解析器处理日志。 demo可以看到解析器也适用于关键字app-info的日志。 Systemmsg将字段app-info放入其预期的值中。

所以我想要模式1,处理没有关键字app-info的日志,模式2使用关键字app-info处理日志。所以我清楚地让模式1在包含关键字app-info时抛出解析错误或异常。

1 个答案:

答案 0 :(得分:1)

  

我的目标是让模式1处理没有关键字app-info的日志。如果   有app-info,第一个模式应该抛出解析错误,这样   第二个解析器可以处理日志。

您可以使用以下内容作为第一种模式,

(?<data>^(?!.*app-info).*)%{LOGLEVEL:log}%{DATA:other_data}%{IP:ip}$

它会做什么,如果在任何位置有app-info,它将忽略日志,并移至2nd PATTERN

<强> 实施例

不使用app-info

进行记录
2018-04-27 10:42:49 [http-nio-8088-exec-1] - INFO  injectip ip 192.168.16.89

您可以根据自己的要求进行过滤。

<强>输出

{
  "data": [
    [
      "2018-04-27 10:42:49 [http-nio-8088-exec-1] - "
    ]
  ],
  "log": [
    [
      "INFO"
    ]
  ],
  "other_data": [
    [
      "  injectip ip "
    ]
  ],
  "ip": [
    [
      "192.168.16.89"
    ]
  ]
}

现在使用app-info

进行登录
2018-04-27 10:42:49 [http-nio-8088-exec-1] - INFO app-info  injectip ip 192.168.16.89

<强>输出

No Matches

test it here

编辑2:

如果您将PATTERN1等于(?<data>^(?!.*app-info).*)

你会得到,

{
  "data": [
    [
      "2018-04-27 10:42:49 [http-nio-8088-exec-1] - INFO  injectip ip 192.168.16.89"
    ]
  ]
}

然后,您可以为data字段添加第二个grok过滤器,如下所示,

grok {
  match => {"data" => "DEFINE PATTERN HERE"}
}