logstash Grok для извлечения разных данных из файла журнала, содержащего другой журнал

Мой файл журнала содержит данные из разных процессов, записывающих данные в один и тот же файл. Файл журнала выглядит примерно так, как показано ниже.

Я пишу, чтобы написать шаблон фильтра Grok для извлечения различных данных и использования их на плате Kibana. Я попробовал один шаблон, но он работает только для одной строки в файле журнала, он не работает для всего файла журнала.

%{UUID:uuid} › %{WORD:level}:%{INT:LOGlevel} %{WORD:RClevel}: %{INT:RClevel} %{WORD:LOGtype} :%{GREEDYDATA:message}

Мне нужны данные о MGMT_RDCIP_INFO, PCI, DP_DRIVER из журнала, такие как RATIO, QUALITY, Ceiling data. Может ли кто-нибудь помочь мне, как получить данные о конкретных ключевых словах из журнала.

ef22119900-99ecf-10e9-7dfc-ffe0ea066dfff > LVL:3 CT:   0 MGMT_RDCIP_INFO :Bandwidth Management for Server: Ceiling = 112500.000000, Floor = 12500.000000, Active = 14825.552639
ef22119900-99ecf-10e9-7dfc-ffe0ea066dfff > LVL:3 CT:   0             PCI :Display 0 codec 0 (H264 Encoder) frames encoded per second : 11.56
ef22119900-99ecf-10e9-7dfc-ffe0ea066dfff > LVL:3 CT:   0             PCI :Display 1 codec 0 (H264 Encoder) frames encoded per second : 25.92
ef22119900-99ecf-10e9-7dfc-ffe0ea066dfff > LVL:3 CT:   0             PCI :QUALITY: 81.3918 81.3918 0.0 0.0
ef22119900-99ecf-10e9-7dfc-ffe0ea066dfff > LVL:3 CT:   0             PCI :RATIO: 5.73013 94.2699 0.0 0.0
ef22119900-99ecf-10e9-7dfc-ffe0ea066dfff > LVL:3 CT:   0       DP_DRIVER :Display duplication output id: 1 move MPPS 0.00, dirty MPPS 162.59, total MPPS 162.59```

[![snaphot of log file][1]][1]



  [1]: https://i.stack.imgur.com/wuFum.jpg

person Rajendra V    schedule 28.04.2021    source источник


Ответы (2)


похоже, проблема в том, что вы используете один пробел в качестве разделителя, верно?

logstash получил grok %{SPACE}, он удалит весь пробел до следующего символа

мой грок фильтр

%{UUID:uuid} > %{WORD:level}:%{INT:LOGlevel} %{WORD:RClevel}:%{SPACE}%{WORD:LOGtype}%{SPACE}%{DATA:stuffyouwant}%{SPACE}:%{GREEDYDATA:message}

Я проверил это, и это работает на всех случаях.

редактировать

Похоже, у вас есть случай, который может быть полезен при использовании оператора if. Нужно 2 грока, как

filter{
    grok{
        match{
            "message"="%{UUID:uuid} > %{WORD:level}:%{INT:LOGlevel} %{WORD:RClevel}:%{SPACE}%{WORD:LOGtype}%{SPACE}%{DATA:stuffyouwant}%{SPACE}:%{DATA:parameters}: %{GREEDYDATA:stuffs}"
        }
    }
    if [parameters] == "RATIO"{
        grok{
            match{
                "stuff"="%{NUMBER:ratio1} %{NUMBER:ratio2} %{NUMBER:ratio3} %{NUMBER:ratio4}%{GREEDYDATA:allratio}"
            }
        }
    } else if [parameters]=="QUALITY"{
        grok{
            match{"stuff"="%{NUMBER:q1} %{NUMBER:q2} %{NUMBER:q3} %{NUMBER:q4}%{GREEDYDATA:allq}"
            }
        } 
    }else if [parameters]==""{
        grok{
            etc...
        }
    }
    }
}

первый grok для определения параметров, а второй grok для каждого из операторов if получает число на основе нужного вам символа.

person yuliansen    schedule 30.04.2021
comment
Спасибо. Моя главная цель - получить информацию из GREEDYDATA. такая информация, как КОЭФФИЦИЕНТ, КАЧЕСТВО, потолок и т. д., чтобы построить график. Любая идея, как получить данные о конкретных ключевых словах из журнала - person Rajendra V; 03.05.2021
comment
извините за мое заблуждение, я добавил пример фильтра, который, кажется, соответствует вашим потребностям, если мой ответ поможет вам, пожалуйста, проголосуйте за него или если он удовлетворит ваши потребности, пожалуйста, примите его как ответ. - person yuliansen; 04.05.2021

UUID лучше всего рассматривать как тип DATA, также убедитесь, что вы не берете пробелы перед RCLevel и LOGtype.

%{DATA:uuid} > %{WORD:LOGlevel_WORD}:%{INT:LOGlevel_INT} %{WORD:RClevel_WORD}:[ ]{0,99}%{NUMBER:RClevel_NUMBER}[ ]{0,99}%{WORD:LOGtype} :%{GREEDYDATA:message}

Это дает мне вывод, например:

{
  "RClevel_INT": "0",
  "LOGlevel_WORD": "LVL",
  "LOGtype": "MGMT_RDCIP_INFO",
  "RClevel_WORD": "CT",
  "LOGlevel_INT": "3",
  "message": "Bandwidth Management for Server: Ceiling = 112500.000000, Floor = 12500.000000, Active = 14825.552639",
  "uuid": "ef22119900-99ecf-10e9-7dfc-ffe0ea066dfff"
}

{
  "RClevel_INT": "0",
  "LOGlevel_WORD": "LVL",
  "LOGtype": "PCI",
  "RClevel_WORD": "CT",
  "LOGlevel_INT": "3",
  "message": "Display 0 codec 0 (H264 Encoder) frames encoded per second : 11.56\r",
  "uuid": "ef22119900-99ecf-10e9-7dfc-ffe0ea066dfff"
}

Обновление (2021-04-29): могут быть отрицательные значения CT без пробела перед ними, обновлен грок

person YouryDW    schedule 28.04.2021
comment
Спасибо, что очень помогли. Нужно ли было извлекать определенные данные из части сообщения, например, кадры, закодированные в секунду. Также значения CT иногда появляются в виде отрицательных целых чисел, таких как ef22119900-99ecf-10e9-7dfc-ffe0ea066dfff > LVL:1 CT:-520 PCI :No codec ID meta data on pixel source. Поэтому я изменил %{INT:RClevel_INT} на %{GREEDYDATA:ctmessage}. - person Rajendra V; 29.04.2021
comment
помните, что вы также можете использовать тип данных NUMBER и что вы можете изменить свой шаблон, чтобы использовать счетчик с минимальным и максимальным количеством пробелов, обновит фрагмент для этого - person YouryDW; 29.04.2021