如果日志包含特定单词,则忽略并转到下一个模式
Ignore and move to next pattern if log contains a specific word
我有一个来自 spring 日志文件的日志文件。日志文件具有三种格式。前两种格式各占一行,中间如果有关键字app-info,就是自己开发者打印的信息。如果不是,则由 spring 框架打印。我们可能会将开发者消息与 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 过滤器中,我使用来自
的指令
filter {
grok {
match => [ "message", "PATTERN1", "PATTERN2" , "PATTERN3" ]
}
}
我当前在 logstash 中的配置如下,其中没有在模式中明确提及应用程序信息:
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 不应包含关键字“app-info”的任何提示?
编辑:
我的目标是,如果没有关键字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).)*,则上面的日志(没有关键字应用信息)解析器工作。参见 demo
但是现在,它也适用于包含关键字 app-info 的日志,这不是预期的,因为现在我想提取时间戳、线程名、日志级别、app-info(是否存在)(该字段应被提取或分组),然后系统消息。期望是第一个解析器 returns 错误,让第二个解析器处理日志。 demo 可以看到解析器也适用于关键字 app-info 的日志。 Systemmsg 将字段 app-info 放入其值中,这不是预期的。
所以我想要模式 1,处理不带关键字 app-info 的日志,模式 2 处理带关键字 app-info 的日志。所以我明确地让模式 1 在包含关键字 app-info 时抛出解析错误或异常。
My goal is let pattern 1 handles log without keyword app-info. If
there is app-info, the first pattern shall throw parse error, so that
the second parser could handle the log.
您可以使用以下作为您的第一个模式,
(?<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
编辑 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"}
}
我为此使用了 GREEDYDATA,假设您有以下日志行
Redirect Controller: successful redirection for click data: {a:123, b:345}
并且您想捕获直到“数据”,然后按如下方式使用 GREEDYDATA
%{GREEDYDATA}data:%{SPACE}%{rest of the pattern}
我有一个来自 spring 日志文件的日志文件。日志文件具有三种格式。前两种格式各占一行,中间如果有关键字app-info,就是自己开发者打印的信息。如果不是,则由 spring 框架打印。我们可能会将开发者消息与 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 过滤器中,我使用来自
filter {
grok {
match => [ "message", "PATTERN1", "PATTERN2" , "PATTERN3" ]
}
}
我当前在 logstash 中的配置如下,其中没有在模式中明确提及应用程序信息:
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 不应包含关键字“app-info”的任何提示?
编辑:
我的目标是,如果没有关键字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).)*,则上面的日志(没有关键字应用信息)解析器工作。参见 demo 但是现在,它也适用于包含关键字 app-info 的日志,这不是预期的,因为现在我想提取时间戳、线程名、日志级别、app-info(是否存在)(该字段应被提取或分组),然后系统消息。期望是第一个解析器 returns 错误,让第二个解析器处理日志。 demo 可以看到解析器也适用于关键字 app-info 的日志。 Systemmsg 将字段 app-info 放入其值中,这不是预期的。
所以我想要模式 1,处理不带关键字 app-info 的日志,模式 2 处理带关键字 app-info 的日志。所以我明确地让模式 1 在包含关键字 app-info 时抛出解析错误或异常。
My goal is let pattern 1 handles log without keyword app-info. If there is app-info, the first pattern shall throw parse error, so that the second parser could handle the log.
您可以使用以下作为您的第一个模式,
(?<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
编辑 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"}
}
我为此使用了 GREEDYDATA,假设您有以下日志行
Redirect Controller: successful redirection for click data: {a:123, b:345}
并且您想捕获直到“数据”,然后按如下方式使用 GREEDYDATA
%{GREEDYDATA}data:%{SPACE}%{rest of the pattern}