Как отличить фильтр grok для похожих журналов

У меня есть такие журналы для dhcpack:

30 июня 06:34:18 HOSTNAME dhcpd: DHCPACK для IP (MAC) через eth2

30 июня 06:34:28 HOSTNAME dhcpd: DHCPACK от IP к MAC через eth2

Как я могу использовать grok, чтобы использовать два разных совпадения? У меня есть эти два совпадения для dhcpack, но просто используйте первое:

((%{SYSLOGTIMESTAMP:timestamp})\s*(%{HOSTNAME:hostname})\sdhcpd\S+\s(%{WORD:dhcp_action})?.[for| on] (%{IPV4:dhcp_client_ip})?.[от|до] (%{COMMONMAC:dhcp_client_mac})?.*через (%{USERNAME:interface}))

((%{SYSLOGTIMESTAMP:timestamp})\s*(%{HOSTNAME:hostname})\sdhcpd\S+\s(%{WORD:dhcp_action})?.*[to] (% {IPV4:dhcp_client_ip})?.*через (%{USERNAME:interface}))

Кто-нибудь может помочь?


person Miguel Bessa    schedule 04.07.2015    source источник


Ответы (3)


Я бы предложил сначала удалить общие вещи (вплоть до двоеточия), а затем обработать более конкретные вещи с более конкретными шаблонами. Некоторые подробности здесь.

Как показано в документе, grok{} может принимать несколько шаблонов:

filter {
  grok { match => { "message" => [
     "Duration: %{NUMBER:duration}",
     "Speed: %{NUMBER:speed}"
  ] } }
}

По умолчанию обработка прекращается после первого совпадения, но это можно настроить.

РЕДАКТИРОВАТЬ:

Основываясь на ваших других комментариях, вы также можете ветвиться на основе условий:

if [myField] == "someValue" {
    grok {
        ...
    }
}
else {
    grok {
        ...
    }
}

В этом случае вы выполняете сравнение ("==") или регулярное выражение ("=~"), чтобы увидеть, следует ли запускать регулярное выражение (grok{}). В зависимости от полной бизнес-логики это кажется пустой тратой времени.

person Alain Collins    schedule 06.07.2015
comment
Я хочу сделать что-то вроде: [for|on] (%{IPV4:dhcp_client_ip})?.[от|до] (%{COMMONMAC:dhcp_client_mac})?.*через (%{USERNAME:interface})) } else { ((%{SYSLOGTIMESTAMP: отметка времени})\s*(%{HOSTNAME:hostname})\sdhcpd\S+\s(%{WORD:dhcp_action})?.*[to] (%{IPV4:dhcp_client_ip})?.*через (%{USERNAME :interface})) } Можно? - person Miguel Bessa; 08.07.2015

Я решаю проблему с этим:

filter { grok { match => ["message", "(dhcpd\S+\s*(%{WORD:dhcp_action_test}))"] } if "DHCPINFORM" в [message] { grok { match => ["message" ,"((%{SYSLOGTIMESTAMP:timestamp})\s* (%{HOSTNAME:hostname})\sdhcpd\S+\s(%{WORD:dhcp_action})?.[ from] (%{IPV4:dhcp_client_ip}))"] } } else if "DHCPDISCOVER" в [сообщении] { grok { match => ["message","((%{SYSLOGTIMESTAMP:timestamp})\s(%{HOSTNAME:hostname})\sdhcpd\S+\s(%{WORD:dhcp_action})?.*[from] (%{COMMONMAC:dhcp_client_mac})"] } } else { уронить {} }

}

person Miguel Bessa    schedule 09.07.2015

Я хочу сделать что-то вроде:

In ((%{SYSLOGTIMESTAMP:timestamp})\s*(%{HOSTNAME:hostname})\sdhcpd\S+\s(%{WORD:dhcp_action})?.[for|on] (%{IPV4:dhcp_client_ip})?.[from|to] (%{COMMONMAC:dhcp_client_mac})?.*via (%{USERNAME:interface})) 

получите просто dhcp_action и используйте оператор if, например:

 if (mCursor != null && mCursor.moveToFirst()) {
         ......
 } else {
         ......
 }

Это возможно?

person Miguel Bessa    schedule 07.07.2015
comment
Да, вы можете использовать условия, хотя можете и не хотеть этого. Я обновил свой оригинальный ответ. - person Alain Collins; 08.07.2015