需要解析日志并创建 2 个受控组,其中一组包含另一组的文本

Need to parse a log and create 2 controlled groups where one group has text of the other group

我想知道是否有人可以帮助我解决解析问题。我一直致力于解析我使用受控组(Description、FooBar 等)的特定日志。解析此日志是一个很大的挑战。

日志文件如下所示:

2021-02-10T09:0022.041-05:00 | Info | TransactionGUID=yyyy1234-12a1-1a99-1234-01ab1ab12abc | TransactionID=123456 | Saving uploaded file to shared folder \foobar\foo\fil\ENV1\ABMylocingZone\TIMS\FileTemplates345678_12345678_01ab1ab12abc-99f5-4a43-9127-01ab1ab12abc.xlsx | CopyToSharedFolder()

我需要放置这组文字:

Saving uploaded file to shared folder \foobar\foo\fil\ENV1\ABMylocingZone\TIMS\FileTemplates345678_12345678_01ab1ab12abc-99f5-4a43-9127-01ab1ab12abc.xlsx | CopyToSharedFolder()

进入“描述”捕获组。

我需要放置这组文字:

12345678

在“FooBar”捕获组中。

以下是我到目前为止所能想到的。如果我尝试添加 FooBar 控制组(从下面的规则中省略),我将失去部分描述控制组。由于我正在使用的应用程序,我需要使用 GROK Debugger 来创建和调试我的规则:

[A-Za-z0-9]{0,7}%{SPACE}%{TIMESTAMP_ISO8601:dateTime}%{SPACE}\|%{SPACE}%{LOGLEVEL:Loglevel}%{SPACE}\|%{SPACE}TransactionGUID=%{UUID:GUID}%{SPACE}\|%{SPACE}TransactionID=%{NUMBER:TransactionId}%{SPACE}\|%{SPACE}(?<Description>(?<=\|\s).*(?=\)?))

短版:

这条消息...

MyGroup12345679ContainsInfo

... 被 message 组捕获,并且它包含的数字被 hidden_message 组捕获。

(?<message>[a-zA-Z]+(?<hidden_message>%{NUMBER})[a-zA-Z]+)

完整版:

至于您的确切日志,我会这样解析它:(出于测试目的,必须将 UUID 替换为 NUMBER

grok {
    message => [
        "%{TIMESTAMP_ISO8601:dateTime}%{SPACE}\|%{SPACE}%{LOGLEVEL:Loglevel}%{SPACE}\|%{SPACE}TransactionGUID=%{NUMBER:GUID}%{SPACE}\|%{SPACE}TransactionID=%{NUMBER:TransactionId}%{SPACE}\|%{SPACE}(?<Description>.*(\(?<FooBar>[0-9]+)_[^\]+\.[a-zA-Z0-9]+).*)",
         "+ the pattern you are using now, unless there is always a path to match there"
    ]
}

测试日志:

2021-02-10T09:0022.041-05:00 | Info | TransactionGUID=82147 | TransactionID=123456 | Saving uploaded file to shared folder \foobar\foo\fil\ENV1\ABMylocingZone\TIMS\FileTemplates345678_12345678_01ab1ab12abc-99f5-4a43-9127-01ab1ab12abc.xlsx | CopyToSharedFolder()

description 部分解释:

.*      # greedily consumes characters 
(                           # matches a filename beginning with a number :
  \(?<FooBar>[0-9]+)      # one "\", a number,
  _[^\]+                     # one _, anything but a "\" once or more
  \.[a-zA-Z0-9]+              # a file extension
)
.*       # the rest of it