Фильтр Grok для logstash, чтобы соответствовать определенному значению из файла журнала - PullRequest
0 голосов
/ 30 октября 2018

У меня есть следующий журнал:

2018-10-30 11:47:52 INFO     30464 SMS-MT [cid:300038] [queue-msgid:bb7a195d-fb23-42ae-bbfa-d2dcda405af9] [smpp-msgid:j.11082.639364178944.#MARKET SETU] [status:ESME_ROK] [prio:1] [dlr:NO_SMSC_DELIVERY_RECEIPT_REQUESTED] [validity:none] [from:2323232] [to:23232132312] [content:'#MARKET SETUP\nadsadadadadasdasdadaasdada mo ang:\nC jean_rivera\n--Mag reply ng A-C']

Я создал фильтр grok на основе шаблона в logstash, чтобы я мог анализировать журнал так, как хочу. И у меня есть это:

%{DATESTAMP:Timestamp} %{LOGLEVEL:Level}     %{BASE10NUM:Pid} %{USERNAME:SMS_TYPE} %{CID:CID} %{GREEDYDATA:Message}

Я пытаюсь создать паттерн GROK, который будет соответствовать 300038 , то есть числу после cid :. Синтаксис всегда один и тот же, [cid: number]. Теперь у меня есть:

    CID (\[cid:[0-9]{6}\])
but that results into: 
"CID": [
    [
      "[cid:300038]"
    ]
  ],

и я хочу соответствовать только 300038, без [cid:] part

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

Я заметил, что между LOG и pid имеется более одного пробела, вы можете сопоставить их все, используя \s*.

Чтобы соответствовать только номеру из [cid:300038], вы можете использовать пользовательский шаблон , \[cid:(?<CID>[0-9]{1,})\], это будет соответствовать cid любой длины, а не только 6 цифр.

Ваш шаблон станет,

%{DATESTAMP:Timestamp} %{LOGLEVEL:Level}\s*%{BASE10NUM:Pid} %{USERNAME:SMS_TYPE} \[cid:(?<CID>[0-9]{1,})\] %{GREEDYDATA:Message}
0 голосов
/ 31 октября 2018

Использование

%{DATESTAMP:Timestamp} %{LOGLEVEL:Level}     %{BASE10NUM:Pid} %{USERNAME:SMS_TYPE} \[cid:(?<CID>[0-9]{6})\] %{GREEDYDATA:Message}
...