Strukturyzacja nieustrukturyzowanych danych za pomocą GROK
Jeśli używasz stosu Elastic (ELK) i jesteś zainteresowany mapowaniem niestandardowych dzienników Logstash na Elasticsearch, ten post jest dla Ciebie.
Stos ELK jest akronimem trzech projektów open source: Elasticsearch, Logstash i Kibana. Razem tworzą platformę do zarządzania logami.
- Elasticsearch to system przeszukiwawczo-analityczny.
- Logstash to potok przetwarzania danych po stronie serwera, który pobiera dane z wielu źródeł jednocześnie, przekształca je, a następnie wysyła do „skrytki”, takiej jak Elasticsearch.
- Kibana pozwala użytkownikom wizualizować dane za pomocą wykresów i wykresów w Elasticsearch.
Beats przyszedł później i jest lekkim narzędziem do przesyłania danych. Wprowadzenie Beats przekształciło Elk Stack w Elastic Stack, ale nie o to chodzi.
Ten artykuł dotyczy Groka, czyli funkcji Logstash, która może przekształcić Twoje logi przed wysłaniem ich do skrytki. Dla naszych celów będę mówił tylko o przetwarzaniu danych z Logstash do Elasticsearch.
Grok to filtr w Logstash, który służy do analizowania nieustrukturyzowanych danych w coś ustrukturyzowanego i nadającego się do zapytań. Znajduje się na wyrażeniu regularnym (regex) i używa wzorców tekstowych do dopasowywania ciągów znaków w plikach dziennika.
Jak zobaczymy w kolejnych sekcjach, użycie Groka robi dużą różnicę, jeśli chodzi o efektywne zarządzanie logami.
Bez Groka dane dziennika są nieustrukturyzowane
Bez Groka, gdy logi są wysyłane z Logstash do Elasticsearch i renderowane w Kibanie, pojawiają się one tylko w wartości komunikatu.
Zapytanie o istotne informacje w tej sytuacji jest trudne, ponieważ wszystkie dane dziennika są przechowywane w jednym kluczu. Byłoby lepiej, gdyby wiadomości dziennika były lepiej zorganizowane.
Nieustrukturyzowane dane z logów
localhost GET /v2/applink/5c2f4bb3e9fda1234edc64d 400 46ms 5bc6e716b5d6cb35fc9687c0
Jeśli przyjrzysz się uważnie surowym danym, zobaczysz, że w rzeczywistości składają się one z różnych części, z których każda jest oddzielona spacją.
Bardziej doświadczeni programiści prawdopodobnie zgadną, co oznacza każda z części i jaki jest komunikat dziennika z wywołania API. Poniżej omówiono prezentację każdego elementu.
Ustrukturyzowany widok naszych danych
- localhost == środowisko
- GET == metoda
- /v2/applink/5c2f4bb3e9fda1234edc64d == url
- 400 == status_odpowiedzi
- 46 ms == czas_reakcji
- 5bc6e716b5d6cb35fc9687c0 == user_id
Jak widzimy w danych strukturalnych, istnieje kolejność logów nieustrukturyzowanych. Kolejnym krokiem jest programowa obróbka surowych danych. Tutaj Grok błyszczy.
Szablony Groka
Wbudowane szablony Grok
Logstash zawiera ponad 100 wbudowanych szablonów do strukturyzowania nieustrukturyzowanych danych. Zdecydowanie powinieneś skorzystać z tego, jeśli to możliwe, w przypadku ogólnych logów syslogowych, takich jak Apache, Linux, haproxy, aws i tak dalej.
Co się jednak stanie, jeśli masz niestandardowe dzienniki, jak w powyższym przykładzie? Musisz zbudować własny szablon Grok.
Niestandardowe szablony Grok
Musisz spróbować zbudować własny szablon Grok. użyłem
Należy pamiętać, że składnia szablonu Grok jest następująca: %{SYNTAX:SEMANTIC}
Pierwszą rzeczą, którą próbowałem zrobić, było przejście do zakładki odkryj w debugerze Grok. Pomyślałem, że byłoby fajnie, gdyby to narzędzie mogło automatycznie generować wzór Groka, ale nie było to zbyt przydatne, ponieważ znalazło tylko dwa dopasowania.
Korzystając z tego odkrycia, zacząłem tworzyć własny szablon w debugerze Grok, używając składni znalezionej na stronie Elastic Github.
Po zabawie z różnymi składniami w końcu udało mi się ustrukturyzować dane dziennika tak, jak chciałem.
Link do debugera Grok
Oryginalny tekst:
localhost GET /v2/applink/5c2f4bb3e9fda1234edc64d 400 46ms 5bc6e716b5d6cb35fc9687c0
Wzór:
%{WORD:environment} %{WORD:method} %{URIPATH:url} %{NUMBER:response_status} %{WORD:response_time} %{USERNAME:user_id}
Co zdarzyło się na końcu
{
"environment": [
[
"localhost"
]
],
"method": [
[
"GET"
]
],
"url": [
[
"/v2/applink/5c2f4bb3e9fda1234edc64d"
]
],
"response_status": [
[
"400"
]
],
"BASE10NUM": [
[
"400"
]
],
"response_time": [
[
"46ms"
]
],
"user_id": [
[
"5bc6e716b5d6cb35fc9687c0"
]
]
}
Mając już szablon Grok i zmapowane dane, ostatnim krokiem jest dodanie go do Logstash.
Aktualizowanie pliku konfiguracyjnego Logstash.conf
Na serwerze, na którym zainstalowałeś stos ELK, przejdź do konfiguracji Logstash:
sudo vi /etc/logstash/conf.d/logstash.conf
Wklej zmiany.
input {
file {
path => "/your_logs/*.log"
}
}
filter{
grok {
match => { "message" => "%{WORD:environment} %{WORD:method} %{URIPATH:url} %{NUMBER:response_status} %{WORD:response_time} %{USERNAME:user_id}"}
}
}
output {
elasticsearch {
hosts => [ "localhost:9200" ]
}
}
Po zapisaniu zmian uruchom ponownie Logstash i sprawdź jego status, aby upewnić się, że nadal działa.
sudo service logstash restart
sudo service logstash status
Na koniec, aby upewnić się, że zmiany weszły w życie, Pamiętaj o zaktualizowaniu indeksu Elasticsearch dla Logstash w Kibanie!
Dzięki Grok Twoje dane dziennika są uporządkowane!
Jak widać na powyższym obrazku, Grok jest w stanie automatycznie dopasowywać dane dziennika za pomocą Elasticsearch. Ułatwia to zarządzanie logami i szybkie wyszukiwanie informacji. Zamiast przekopywać się przez pliki dziennika w celu debugowania, możesz po prostu filtrować według tego, czego szukasz, na przykład środowiska lub adresu URL.
Wypróbuj wyrażenia Groka! Jeśli masz inny sposób, aby to zrobić lub masz problemy z powyższymi przykładami, po prostu napisz komentarz poniżej, aby dać mi znać.
Dziękuję za przeczytanie — i śledź mnie tutaj na Medium, aby uzyskać więcej interesujących artykułów na temat inżynierii oprogramowania!
Ресурсы
P.S.
Kanał telegramu wg
Źródło: www.habr.com