Метод filter/grok в logstash

Предположим, у меня есть этот файл журнала:

Jan 1 22:54:17 drop   %LOGSOURCE% >eth1 rule: 7; rule_uid: {C1336766-9489-4049-9817-50584D83A245}; src: 70.77.116.190; dst: %DSTIP%; proto: tcp; product: VPN-1 & FireWall-1; service: 445; s_port: 2612;
Jan 1 22:54:22 drop   %LOGSOURCE% >eth1 rule: 7; rule_uid: {C1336766-9489-4049-9817-50584D83A245}; src: 61.164.41.144; dst: %DSTIP%; proto: udp; product: VPN-1 & FireWall-1; service: 5060; s_port: 5069;
Jan 1 22:54:23 drop   %LOGSOURCE% >eth1 rule: 7; rule_uid: {C1336766-9489-4049-9817-50584D83A245}; src: 69.55.245.136; dst: %DSTIP%; proto: tcp; product: VPN-1 & FireWall-1; service: 445; s_port: 2970;
Jan 1 22:54:41 drop   %LOGSOURCE% >eth1 rule: 7; rule_uid: {C1336766-9489-4049-9817-50584D83A245}; src: 95.104.65.30; dst: %DSTIP%; proto: tcp; product: VPN-1 & FireWall-1; service: 445; s_port: 2565;
Jan 1 22:54:43 drop   %LOGSOURCE% >eth1 rule: 7; rule_uid: {C1336766-9489-4049-9817-50584D83A245}; src: 222.186.24.11; dst: %DSTIP%; proto: tcp; product: VPN-1 & FireWall-1; service: 2967; s_port: 6000;
Jan 1 22:54:54 drop   %LOGSOURCE% >eth1 rule: 7; rule_uid: {C1336766-9489-4049-9817-50584D83A245}; src: 74.204.108.202; dst: %DSTIP%; proto: udp; product: VPN-1 & FireWall-1; service: 137; s_port: 53038;
Jan 1 22:55:10 drop   %LOGSOURCE% >eth1 rule: 7; rule_uid: {C1336766-9489-4049-9817-50584D83A245}; src: 71.111.186.26; dst: %DSTIP%; proto: tcp; product: VPN-1 & FireWall-1; service: 445; s_port: 38548;
Jan 1 23:02:56 accept %LOGSOURCE% >eth1 inzone: External; outzone: Local; rule: 3; rule_uid: {723F81EF-75C9-4CBB-8913-0EBB3686E0F7}; service_id: icmp-proto; ICMP: Echo Request; src: 24.188.22.101; dst: %DSTIP%; proto:

Какой метод filter/grok я могу реализовать, чтобы они были разделены на разные поля? Если бы я использовал точку с запятой в качестве разделителя, это было бы иначе для последней строки данных, поскольку точек с запятой больше, чем в других строках. Должен ли я использовать оператор If else для его разделения?


person imbadatcoding    schedule 17.08.2015    source источник


Ответы (1)


Похоже на типичный пример использования grok и Фильтр kv.

Сначала используйте фильтр grok, чтобы разделить поля. Поместите последнюю часть (пары ключ-значение) в одно поле. Используйте отладчик grok, чтобы найти правильный шаблон. Это может быть подход:

%{CISCOTIMESTAMP:timestamp} %{WORD:action}%{SPACE}%{DATA:logsource} %{DATA:interface} %{GREEDYDATA:kvpairs}

В конфигурации logstash:

grok {
    match => [ 'message', '%{CISCOTIMESTAMP:timestamp} %{WORD:action}%{SPACE}%{DATA:logsource} %{DATA:interface} %{GREEDYDATA:kvpairs}' ]
}

Затем используйте фильтр kv для разделения пар ключ-значение. Что-то вроде этого может сработать:

kv {
    source => "kvpairs" # new field generated by grok before
    field_split => "; " # split fields by semicolon
} 

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

person hurb    schedule 17.08.2015
comment
Я попробую позже! Должен ли я после этого сам указывать столбцы для kvpairs? - person imbadatcoding; 17.08.2015
comment
Нет, фильтр kv распознает столбцы. Таким образом, столбцы могут варьироваться в зависимости от сообщения. - person hurb; 17.08.2015