Struktura danych niestrukturalnych za pomocą GROK
Jeśli korzystasz z zestawu Elastic (ELK) i jesteś zainteresowany mapowaniem niestandardowych dzienników Logstash z Elasticsearch, ten post jest dla Ciebie.

Zestaw ELK to skrót trzech projektów open source: Elasticsearch, Logstash i Kibana. Razem tworzą platformę do zarządzania dziennikami.
- Elasticsearch – to system wyszukiwania i analizy.
- Logstash – to serwerowy procesor danych, który jednocześnie przyjmuje dane z różnych źródeł, przetwarza je, a następnie wysyła do „magazynu”, na przykład Elasticsearch.
- Kibana umożliwia użytkownikom wizualizację danych za pomocą diagramów i wykresów w Elasticsearch.
Beats pojawił się później i jest lekkim narzędziem do przesyłania danych. Wprowadzenie Beats przekształciło Elk Stack w Elastic Stack, ale to nie jest najważniejsze.
Ten artykuł jest poświęcony Grok, który jest funkcją w Logstash, która może przetwarzać Twoje dzienniki przed ich wysłaniem do magazynu. W naszych celach będę odnosić się tylko do przetwarzania danych z Logstash do Elasticsearch.

Grok to filtr w Logstash, który służy do analizy danych niestrukturalnych na coś strukturalnego i dającego się zapytać. Działa na podstawie wyrażeń regularnych (regex) i wykorzystuje szablony tekstowe do dopasowywania linii w plikach dzienników.
Jak zobaczymy w kolejnych sekcjach, użycie Grok ma kluczowe znaczenie dla efektywnego zarządzania dziennikami.
Bez Grok Twoje dane dziennika są niestrukturalne.

Bez Grok, gdy dzienniki są wysyłane z Logstash do Elasticsearch i wizualizowane w Kibana, pojawiają się tylko w wartości wiadomości.
W tej sytuacji trudne jest zapytanie o istotne informacje, ponieważ wszystkie dane dziennika są przechowywane w jednym kluczu. Lepiej byłoby, gdyby wiadomości dziennika były lepiej zorganizowane.
Dane niestrukturalne z logów
localhost GET /v2/applink/5c2f4bb3e9fda1234edc64d 400 46ms 5bc6e716b5d6cb35fc9687c0Jeśli dokładnie przyjrzysz się nieprzetworzonym danym, zobaczysz, że w rzeczywistości składają się one z różnych części, z których każda jest oddzielona spacją.
Dla bardziej doświadczonych programistów prawdopodobnie możesz zgadnąć, co oznacza każda z części i że to jest wiadomość dziennika z wywołania API. Opis każdej pozycji przedstawiony jest poniżej.
Strukturalny wygląd naszych danych
- localhost == środowisko
- GET == metoda
- /v2/applink/5c2f4bb3e9fda1234edc64d == url
- 400 == status_odpowiedzi
- 46ms == czas_odpowiedzi
- 5bc6e716b5d6cb35fc9687c0 == id_użytkownika
Jak widać w danych strukturalnych, istnieje porządek dla niestrukturalnych dzienników. Następnym krokiem jest przetwarzanie danych nieprzetworzonych. To tutaj Grok świeci.
Szablony Grok
Wbudowane szablony Grok
Logstash dostarczany jest z ponad 100 wbudowanymi szablonami do strukturyzacji niestrukturalnych danych. Zdecydowanie powinieneś skorzystać z tej zalety, gdy to możliwe dla ogólnych dzienników systemowych, takich jak apache, linux, haproxy, aws i tak dalej.
Jednak co się dzieje, gdy masz niestandardowe dzienniki, jak w podanym powyżej przykładzie? Musisz stworzyć swój własny szablon Grok.
Niestandardowe szablony Grok
Musisz próbować, aby skonstruować swój własny szablon Grok. Użyłem i .
Zauważ, że składnia szablonów Grok wygląda następująco: %{SYNTAX:SEMANTICS}
Pierwszą rzeczą, którą próbowałem zrobić, to przejść na zakładkę Odkryj w debuggerze Grok. Pomyślałem, że byłoby świetnie, gdyby to narzędzie mogło automatycznie generować szablon Grok, ale to nie było zbyt pomocne, gdyż znalazło tylko dwa dopasowania.

Korzystając z tego odkrycia, zacząłem tworzyć własny szablon w debuggerze Grok, używając składni znalezionej na stronie Github Elastic.

Bawiąc się różnymi składniami, w końcu udało mi się ustrukturyzować dane dziennika tak, jak chciałem.

Link do debuggera Grok
Tekst źródłowy:
localhost GET /v2/applink/5c2f4bb3e9fda1234edc64d 400 46ms 5bc6e716b5d6cb35fc9687c0Wzór:
%{WORD:środowisko} %{WORD:metoda} %{URIPATH:url} %{NUMBER:status_odpowiedzi} %{WORD:czas_odpowiedzi} %{USERNAME:id_użytkownika}To, co udało się osiągnąć
{
"środowisko": [
[
"localhost"
]
],
"metoda": [
[
"GET"
]
],
"url": [
[
"/v2/applink/5c2f4bb3e9fda1234edc64d"
]
],
"status_odpowiedzi": [
[
"400"
]
],
"BASE10NUM": [
[
"400"
]
],
"czas_odpowiedzi": [
[
"46ms"
]
],
"id_użytkownika": [
[
"5bc6e716b5d6cb35fc9687c0"
]
]
}Mając w rękach szablon Grok i dopasowane dane, ostatnim krokiem jest dodanie go do Logstash.
Aktualizacja pliku konfiguracyjnego Logstash.conf
Na serwerze, na którym zainstalowałeś stos ELK, przejdź do konfiguracji Logstash:
sudo vi /etc/logstash/conf.d/logstash.confWklej zmiany.
input {
file {
path => "/your_logs/*.log"
}
}
filter{
grok {
match => { "message" => "%{WORD:środowisko} %{WORD:metoda} %{URIPATH:url} %{NUMBER:status_odpowiedzi} %{WORD:czas_odpowiedzi} %{USERNAME:id_użytkownika}"}
}
}
output {
elasticsearch {
hosts => [ "localhost:9200" ]
}
}Po zapisaniu zmian, uruchom ponownie Logstash i sprawdź jego stan, aby upewnić się, że nadal działa.
sudo service logstash restart
sudo service logstash statusNa koniec, aby upewnić się, że zmiany zostały wprowadzone, koniecznie zaktualizuj indeks Elasticsearch dla Logstash w Kibana!

Z Grok twoje dane z logów są uporządkowane!

Jak widzimy na powyższym obrazku, Grok potrafi automatycznie mapować dane logów do Elasticsearch. Ułatwia to zarządzanie logami i szybkie wyszukiwanie informacji. Zamiast grzebać w plikach logów w celu debugowania, możesz po prostu przefiltrować to, czego szukasz, na przykład środowisko lub adres URL.
Spróbuj dać Grok expressions szansę! Jeśli masz inny sposób na zrobienie tego lub masz jakiekolwiek problemy z powyższymi przykładami, po prostu napisz komentarz poniżej, aby mnie o tym poinformować.
Dzięki za przeczytanie — i proszę, śledź mnie tutaj, na Medium, aby uzyskać więcej interesujących artykułów o inżynierii oprogramowania!
Resources
P.S
Kanał Telegram o
Źródło: habr.com
