LogStash - 解析日志

时间:2018-02-02 06:23:32

标签: regex elasticsearch logstash logstash-grok

我正在尝试解析我的日志文件。它正在运行但是有一个新的要求,我需要从解析的日志中获取新字段。 日志或多或少:

|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'.

我想要实现的目标?

  • 我想有一个应该解析的新字段 来自[Custom.EndpointSecond·[Document·508]](如果没有日志) [文件x]那么这个字段应该是空的。
  • 我想用填充的字符串填充消息 在田野之后。

任何帮助将不胜感激

1 个答案:

答案 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 +字符,然后是]
  • ] - ]字符。