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

Regex 正则表达式,用于提取管道字符后可能出现或可能不出现的日志消息,regex,pcre,splunk,Regex,Pcre,Splunk,我正在尝试将数据提取到Splunk数据模型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 el

我正在尝试将数据提取到
Splunk数据模型
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+.\\\\(?.\*)
在没有管道角色的情况下拖动所有内容:

\S*\S*\S*\[.\]\S+[A-Z]+\S+(.\\.\*))
我正在研究的最新想法是做一个消极的前瞻,提取管道字符之前没有的数据

\S*\S*\S*\[.\]\S+[A-Z]+\S+(?*(!\))

我尝试的每一个组合要么匹配所有东西,要么不匹配,要么匹配我想要的一半。所以希望一些正则表达式大师能帮助我。我试着在网上找到一个有效的答案,但到目前为止我还没有找到。

你有没有试过在两个单独的正则表达式之间使用OR

ERROR (\S+ - ).+\| (.+)|INFO (\S+ - )(.+)
对我有用。他们甚至都有两个信息和细节的捕获组

几乎可以从
ERROR
INFO
开始匹配,抓起连字符
-
,然后查找字符串的其余部分。错误将有一个管道,因此在此之前忽略所有内容,并且信息输出将没有管道,所以也只需抓住连字符后面的所有内容

这是关于Regex101的一个例子

编辑:

我相信我有正确的解决办法


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

您可以通过管道拆分到数组吗?然后检查element2.length是否大于0,则您有文本,否则没有文本。一行代码否,我只能放入一个正则表达式。除了一个正则表达式,我不能做任何操作。对于那些不熟悉Splunk的人,()部分是我指定哪些数据将进入消息字段的地方。为了澄清,任何日志级别(错误、信息、警告等)都可能有管道字符,也可能没有管道字符。当它在Regex101上工作时。。。它在Splunk中不起作用。当存在管道字符时,它仍然会捕获整个消息(管道之前和之后的所有内容)\S*\S*\S*[.]\S+[A-Z]+\S+(?((\S+-).++\\\\.+)(.S+-)(.+)@RobertPenberthy我想我有一个使用正则表达式替换的解决方案。与其试图捕获您想要的数据,不如捕获您不想要的数据并将其丢弃。我已将此解决方案添加到原始答案中。将您提供的内容放入我需要的Splunk表单中,我会丢失日志级别和连字符之间的文本。。。但是我得到了我想要提取的肉,所以我没有它也能活下去。非常感谢你!下面是它在Splunk格式中的样子:
\S*\S*\S*\[.\]\S+[A-Z]+\S+(\S+-)(?:。+\\\\)(?。。(?*)
\S* \S* \S* \[.*\]\s+[A-Z]+\s+(.*\||(?<message>.\*))
\S* \S* \S* \[.*\]\s+[A-Z]+\s+(?<message>.*(?!\|))
ERROR (\S+ - ).+\| (.+)|INFO (\S+ - )(.+)
.+ (\S+ - )(?:.+\| )?