正则表达式用于提取管道字符后可能出现或可能不出现的日志消息

时间:2014-07-18 17:32:48

标签: regex pcre splunk

我正在尝试将数据提取到Splunk Data Model Regex属性中。我试图从事件中提取的数据以几种方式记录。

2014-07-17 21:29:43,620 UTC [http-apr-8080-exec-143] ERROR c.s.b.b.s.impl.HttpRequestLogFilter - Apps="UNKNOWN" ReqIP="1.1.1.1" ReqProt="https" | FAILED: 500 POST /something/v1/something/v1/group elapsed:14


2014-07-17 21:29:42,797 UTC [persistentScheduler_Worker-6] INFO c.s.b.s.b.svc.impl.DocumentIndexJob - data source UNKNOWN\_163\_2 (Customer Information), customer 1, institution 1 is still indexing

如果正则表达式会从两行返回以下值,我会很喜欢它:

c.s.b.b.s.impl.HttpRequestLogFilter - FAILED: 500 POST /something/v1/something/v1/group elapsed:14

c.s.b.s.b.svc.impl.DocumentIndexJob - data source UNKNOWN\_163\_2 (Customer Information), customer 1, institution 1 is still indexing

我已经提出了分别处理每种情况的正则表达式,但没有能够处理这两种情况并将它们放入同一字段的正则​​表达式。

拉出竖线字符后的所有内容

\S* \S* \S* \[.*\]\s+[A-Z]+\s+.*\|(?<message>.\*)

在没有竖线字符的情况下拉出所有内容

\S* \S* \S* \[.*\]\s+[A-Z]+\s+(.*\||(?<message>.\*))

我正在研究的最新想法是做一个否定预测并提取管道角色之前没有的数据

\S* \S* \S* \[.*\]\s+[A-Z]+\s+(?<message>.*(?!\|))

我尝试的每一种组合都符合我想要的一切,没有,或一半。所以希望一些正则表达式大师可以帮助我。我已经尝试找到一个在线工作的答案,但我还没有到目前为止。

1 个答案:

答案 0 :(得分:0)

您是否尝试在两个单独的正则表达式案例之间使用OR |

ERROR (\S+ - ).+\| (.+)|INFO (\S+ - )(.+)

适合我。他们甚至都有两个捕获组用于消息和细节。

您开始在ERRORINFO开始匹配,抓住连字符-,然后查找字符串的其余部分。错误将有一个管道,所以在此之前忽略所有内容,并且信息输出不会有管道,所以只需抓住连字符后的所有内容。

这是Regex101上的demo

编辑:

我相信我有正确的解决方案here

.+ (\S+ - )(?:.+\| )?

这将捕获-之前的最后一个非空格字符,然后继续封装到(如果它存在)并用捕获组替换字符串的整个前面