如何使用 rex 从日志文件中获取两个字段?

How to get two fields using rex from log file?

我是 Splunk 的新手。我的目标是从日志中获取两个或更多字段。我必须检查一个字段是否为 true,因此使用另一个字段来制作计数器。计数器是关于客户端使用 user-agent 属性发出的请求数。

我想要的逻辑:

int count1, count2;
count1 = 0;
count2 = 0;

if (GW == true) {
  if (UA == "user-agent1") count1++;
  if (UA == "user-agent2") count2++;
}

目前我只能得到一个字段并在没有 if-condition 的情况下进行计数器。

此查询工作正常,return 正确的请求计数器:

source="logfile.log" | rex "UA=(?<ua>\w+)" | stats count(eval(ua="user-agent1")) as USER-AGENT1

但是,当我尝试获取第二个字段 (GW) 来构建逻辑时,查询 returns 0.

source="logsfile.log" | rex "UA=(?<ua>\w+) GW=(?<gw>\w+)" |stats count(eval(ua="user-agent1")) as USER-AGENT1

那么,我如何获得更多字段以及如何在查询中生成 if-condition

示例日志:

2020-01-10 14:38:44,539 INFO  [http-nio-8080-exec-8] class:ControllerV1, UA=user-agent1, GW=true
2020-01-10 14:23:51,818 INFO  [http-nio-8080-exec-3] class:ControllerV1, UA=user-agent2, GW=true

它将是这样的:

source="logsfile.log" UA GW 
| rex "UA=(?<ua>\w+), GW=(?<gw>\w+)" 
| stats count(eval(gw="true" AND ua="user-agent1")) as AGENT1, 
        count(eval(gw="true" AND ua="user-agent2")) as AGENT2

例如,如果您不知道变量的顺序或变量超过 2 个,则可以使用单独的 rex 语句:

source="logsfile.log" UA GW 
| rex "UA=(?<ua>\w+)"
| rex "GW=(?<gw>\w+)" 
| stats count(eval(gw="true" AND ua="user-agent1")) as AGENT1, 
        count(eval(gw="true" AND ua="user-agent2")) as AGENT2

这可能会有点慢,因为 _raw 将被解析两次。