Как получить два поля с помощью rex из файла журнала?

Я новичок в 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.

Этот запрос работает нормально и возвращает правильный счетчик запросов:

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

Но когда я пытаюсь получить второе поле (GW), чтобы создать логику, запрос возвращает 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

person Augusto    schedule 10.01.2020    source источник
comment
В вашем журнале есть запятая (,) между выражениями UA и GW, а в rex - нет.   -  person PM 77-1    schedule 10.01.2020
comment
Спасибо @ PM77-1. Решена первая проблема, теперь не используется правильно if-condition   -  person Augusto    schedule 10.01.2020
comment
Вам не нужно if просто использовать AND в логическом выражении   -  person PM 77-1    schedule 10.01.2020
comment
Я не знаю, как использовать AND. Куда я могу его положить? Если в журнале есть больше полей типа UA=user-agent1, M=method, URI=some_uri ,GW=true, V=v1. Как мне извлечь всего 2 поля?   -  person Augusto    schedule 10.01.2020
comment
Я выложил свой ответ. Надеюсь, без опечаток. Что касается другого формата журнала, вам нужно будет улучшить ваше регулярное выражение или использовать несколько операторов rex.   -  person PM 77-1    schedule 10.01.2020


Ответы (1)


Это будет примерно так:

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

Если, например, вы не знаете порядок переменных или у вас их больше двух, вы можете использовать отдельные инструкции 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 будет проанализирован дважды.

person PM 77-1    schedule 10.01.2020
comment
Вы можете помочь мне улучшить запрос на получение журналов другого формата? Нравится: UA=something, URI=something, M=something, GW=something - person Augusto; 10.01.2020
comment
Добавлено 2-е решение - person PM 77-1; 10.01.2020
comment
работал нормально без использования UA GW вскоре после источника. Спасибо. - person Augusto; 10.01.2020