如何使用 Grok 解析无顺序和结构的应用程序日志

问题描述 投票:0回答:2

我正在使用 Grok 解析应用程序日志,使用 https://grokconstructor.appspot.com/do/match.

进行测试

日志如下:

2023-04-01 02:00:00,007 [nioEventLoopGroup-13-13] INFO {"deviceid":"aaaaaaaaaa","userAgent":"device"}
2023-04-01 02:00:01,234 [nioEventLoopGroup-13-13] INFO {"userAgent":"device","deviceid":"bbbbbbbbbb"}
2023-04-01 02:00:02,234 [nioEventLoopGroup-13-13] INFO {"userAgent":"device"}

我的 Grok 模式:

%{GENERATE_TIME:generateTime}.*?%{DEVICEID:deviceId}.*?%{AGENT:userAgent}

自定义图案:

GENERATE_TIME \d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2},\d{3}
DEVICEID deviceid":"(.{10})
AGENT "userAgent":"(.*?)"

输出: output

预期产出:

[
    {
        "generateTime": "2023-04-01·02:00:00,007",
        "deviceId": "aaaaaaaaaa",
        "userAgent": "device"
    },
    {
        "generateTime": "2023-04-01·02:00:01,234",
        "deviceId": "bbbbbbbbbb",
        "userAgent": "device"
    },
    {
        "generateTime": "2023-04-01·02:00:02,234",
        "userAgent": "device"
    }
]

看来有两个问题要解决,如何把

deviceId
userAgent
匹配干净,如何无序解析log。

提前致谢。

aws-glue grok
2个回答
0
投票

你能试试下面的 grok 模式和反馈吗?

filter
{
grok
{
match => 
{
"message" => ['%{TIMESTAMP_ISO8601:timestamp} %{GREEDYDATA:event}] %{LOGLEVEL:loglevel} %{DATA:deviceid}:%{DATA:id},%{DATA:useragent}:"%{DATA:agentname}"
', '%{TIMESTAMP_ISO8601:timestamp} %{GREEDYDATA:event}] %{DATA:loglevel} %{DATA:useragent}:"%{DATA:agentname}"']
}
}
}

0
投票

我想你可以使用下面的

grok
模式:

grok {
  match => { "message" => "%{TIMESTAMP_ISO8601:generateTime} \[%{DATA:thread}\] %{LOGLEVEL:loglevel} %{GREEDYDATA:json_data}" }
}

这应该匹配上面的所有 3 行。为了得到你指定的输出,就在

grok
之后,你可以使用

json {
  source => "json_data"
  remove_field => ["json_data"]
}

json
过滤器会将
json_data
解析为单独的字段。

© www.soinside.com 2019 - 2024. All rights reserved.