我有这来自春天的日志文件中的日志文件。 日志文件有三种格式。 每个第一两种格式的是一个单一的线,在它们之间是否有关键词APP-信息,它是由自己的显影剂打印的消息。 如果没有,它由弹簧框架打印。 我们可以把从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框架格局没有关键字的应用程序,信息,使其能得到paserexception和遵循的是开发商自己的格式的第二图案。 所以,我有以下格式的正则表达式的工具 ,但我得到了编译错误。 我的正则表达式如下:
(?<timestamp>[\d\-\s\:]+)\s\[(?<threadname>[\d\.\w\s\(\)\-]+)\]\s-\s(?<loglevel>[\w]+)\s+-\s+(?<systemmsg>[^((?app-info).)*\s\.\w\-\'\:\d\[\]\/]+)
因为在神交过滤器,我使用的指示,从这个链接
filter {
grok {
match => [ "message", "PATTERN1", "PATTERN2" , "PATTERN3" ]
}
}
我目前在logstash配置如下:这不花纹明显提APP-信息:
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框架模式)已经工作的,因此它不属于这是我们自己开发的格式第二图案。 解析器已成功parsered如下:
{
"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不得含有关键字“应用程序,信息”?
编辑:
我的目标是,如果没有关键字的应用程序,信息,我让模式1处理日志。 如果有关键字的应用程序,信息,我让模式2处理日志。
随着下面的日志不包含关键字的应用程序,信息(模式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\[\]\/]+)
看到演示 。 我的目标是提取时间戳,线程名,日志级别和系统味精。 但是第一图案不给我预期的结果。 该工具说没有匹配。
如果我删除^(?:( ?! APP-INFO)。)*,然后上面的日志(不含关键字的应用,资讯)解析器工程。 见演示但现在,它也适用于包含关键字的应用程序,信息预计不日志,因为现在我想提取时间戳,threadname,日志级别,应用,信息(存在与否)(领域应提取或分组),然后systemmsg。 人们期望,第一分析器返回错误,让第二语法分析器处理日志。 演示可以看到解析器也适用于日志与关键字的应用程序,信息。 Systemmsg把现场的应用程序,信息到其价值预计不。
所以,我想模式1,处理日志,但不关键字的应用程序,信息,模式2个手柄记录与关键字的应用程序,信息。 所以,我清楚地让图案1掷解析错误或异常时,它包含关键字的应用程序,信息。