我正在尝试解析我的日志文件。它正在运行但是有一个新的要求,我需要从解析的日志中获取新字段。 日志或多或少:
|2018-02-01 13:48:00.882|[v2.8.0.0]|DEBUG|[EndpointFirst] |Session activated (documentId: 508, workflow id: 1)|
|2018-02-01 13:48:00.901|[v2.8.0.0]|INFO|[Custom.EndpointSecond [Document 508]]|Firing event 'DocumentReceived' on state machine with current state 'Initial' and event argument 'CustomArgument'.|
我的grok过滤器:
(?<my_timestamp>%{TIMESTAMP_ISO8601:timestamp})\s*(?<my_version>\[v.{7}])s*(?<my_severity>\s+%{LOGLEVEL:loglevel})\s*(?<my_endpoint>\[.{1,}])\s*(?<my_message>%{DATA:message})
现在我得到了以下字段(测试grok模式的结果):
MATCHED
my_version [v2.8.0.0]
my_timestamp 2018-02-01·13:48:00.901
timestamp 2018-02-01·13:48:00.901
my_endpoint [Custom.EndpointSecond·[Document·508]]
my_message
my_severity ⇥INFO
message
loglevel INFO
after match: Firing event 'DocumentReceived' on state machine with current state 'Initial' and event argument 'CustomArgument'.
我想要实现的目标?
任何帮助将不胜感激
答案 0 :(得分:0)
您可以使用
(?<my_timestamp>%{TIMESTAMP_ISO8601:timestamp})\s*\|\s*(?<my_version>\[v.{7}])\s*\|\s*(?<my_severity>%{LOGLEVEL:loglevel})\s*\|\s*(?<my_endpoint>\[.*?(?<new_field>\[[^\]]*])?])\s*\|\s*(?<my_message>%{GREEDYDATA:message})
注意\s*\|\s*
(匹配用0+空格括起的|
而不仅仅是\s*
(因为你在字符串中有管道),\[.*?(?<new_field>\[[^\]]*])?]
来匹配[...]
数据中的可选my_endpoint
子字符串和%{GREEDYDATA:message}
(= .*
)代替%{DATA:message}
(= .*?
)。
\[.*?(?<new_field>\[[^\]]*])?]
详细信息
\[
- [
.*?
- 除了换行符之外的零个或多个字符,尽可能少(?<new_field>\[[^\]]*])?
- 一个可选的捕获组&#34; new_field&#34;:[
,然后是]
以外的任何0 +字符,然后是]
]
- ]
字符。