GROK ilə strukturlaşdırılmamış məlumatların strukturlaşdırılması
Əgər siz Elastic (ELK) yığınından istifadə edirsinizsə və xüsusi Logstash qeydlərini Elasticsearch-a çəkməklə maraqlanırsınızsa, bu yazı sizin üçündür.
ELK yığını üç açıq mənbəli layihənin qısaldılmasıdır: Elasticsearch, Logstash və Kibana. Birlikdə onlar log idarəetmə platformasını təşkil edirlər.
- Elasticsearch axtarış və analitik sistemdir.
- Logstash eyni vaxtda birdən çox mənbədən məlumatları qəbul edən, onları dəyişdirən və sonra Elasticsearch kimi "saklama"ya göndərən server tərəfi məlumat emal boru kəməridir.
- Kibana istifadəçilərə Elasticsearch-də qrafiklər və qrafiklərdən istifadə edərək məlumatları vizuallaşdırmağa imkan verir.
Beats sonra gəldi və yüngül məlumat daşıyıcısıdır. Beats-in tətbiqi Elk Stack-i Elastik Yığına çevirdi, lakin məsələ bu deyil.
Bu məqalə Logstash-da qeydlərinizi anbara göndərilməmişdən əvvəl dəyişdirə bilən bir xüsusiyyət olan Grok haqqındadır. Məqsədlərimiz üçün mən yalnız Logstash-dan Elasticsearch-də məlumatların işlənməsi haqqında danışacağam.
Grok, strukturlaşdırılmamış məlumatları strukturlaşdırılmış və sorğulana bilən bir şeyə təhlil etmək üçün istifadə olunan Logstash daxilindəki bir filtrdir. O, müntəzəm ifadənin (regex) üstündə oturur və log fayllarında sətirləri uyğunlaşdırmaq üçün mətn nümunələrindən istifadə edir.
Növbəti bölmələrdə görəcəyimiz kimi, Grok-dan istifadə səmərəli log idarəçiliyinə gəldikdə böyük fərq yaradır.
Grok olmadan log datanız strukturlaşdırılmamışdır
Grok olmadan, loglar Logstash-dan Elasticsearch-ə göndərildikdə və Kibana-da təqdim edildikdə, onlar yalnız mesaj dəyərində görünür.
Bu vəziyyətdə mənalı məlumatı sorğulamaq çətindir, çünki bütün log məlumatları bir açarda saxlanılır. Günlük mesajları daha yaxşı təşkil edilsə, daha yaxşı olardı.
Qeydlərdən strukturlaşdırılmamış məlumatlar
localhost GET /v2/applink/5c2f4bb3e9fda1234edc64d 400 46ms 5bc6e716b5d6cb35fc9687c0
Xam məlumatlara diqqətlə baxsanız, onun əslində hər biri boşluqla ayrılmış müxtəlif hissələrdən ibarət olduğunu görəcəksiniz.
Daha təcrübəli tərtibatçılar üçün, yəqin ki, hissələrin hər birinin nə demək olduğunu və API çağırışından həmin log mesajının nə olduğunu təxmin edə bilərsiniz. Hər bir maddənin təqdimatı aşağıda verilmişdir.
Məlumatlarımızın strukturlaşdırılmış görünüşü
- localhost == mühit
- GET == üsulu
- /v2/applink/5c2f4bb3e9fda1234edc64d == url
- 400 == cavab_status
- 46ms == cavab_zamanı
- 5bc6e716b5d6cb35fc9687c0 == user_id
Strukturlaşdırılmış məlumatlarda gördüyümüz kimi, strukturlaşdırılmamış qeydlər üçün sifariş var. Növbəti addım xam məlumatların proqram təminatı ilə işlənməsidir. Qrokun parladığı yer budur.
Grok şablonları
Quraşdırılmış Grok şablonları
Logstash, strukturlaşdırılmamış məlumatların strukturlaşdırılması üçün 100-dən çox daxili şablonla gəlir. Apache, linux, haproxy, aws və s. kimi ümumi syslogs üçün mümkün olduqda mütləq bundan faydalanmalısınız.
Bununla belə, yuxarıdakı nümunədəki kimi fərdi qeydləriniz olduqda nə baş verir? Öz Grok şablonunuzu yaratmalısınız.
Xüsusi Grok şablonları
Öz Grok şablonunuzu yaratmağa çalışmalısınız. Mən istifadə etdim
Qeyd edək ki, Grok şablon sintaksisi aşağıdakı kimidir: %{SYNTAX:SEMANTIC}
Etməyə çalışdığım ilk şey nişana keçmək oldu Kəşf etmək Grok sazlayıcıda. Düşündüm ki, bu alət avtomatik olaraq Grok nümunəsi yarada bilsəydi, yaxşı olardı, lakin o, yalnız iki uyğunluq tapdığı üçün çox faydalı olmadı.
Bu kəşfdən istifadə edərək, Elastic Github səhifəsində tapılan sintaksisdən istifadə edərək Grok debugger-də öz şablonumu yaratmağa başladım.
Fərqli sintaksislərlə oynadıqdan sonra nəhayət log məlumatlarını istədiyim kimi strukturlaşdıra bildim.
Grok Debugger Link
Orijinal mətn:
localhost GET /v2/applink/5c2f4bb3e9fda1234edc64d 400 46ms 5bc6e716b5d6cb35fc9687c0
Pattern:
%{WORD:environment} %{WORD:method} %{URIPATH:url} %{NUMBER:response_status} %{WORD:response_time} %{USERNAME:user_id}
Sonda nə oldu
{
"environment": [
[
"localhost"
]
],
"method": [
[
"GET"
]
],
"url": [
[
"/v2/applink/5c2f4bb3e9fda1234edc64d"
]
],
"response_status": [
[
"400"
]
],
"BASE10NUM": [
[
"400"
]
],
"response_time": [
[
"46ms"
]
],
"user_id": [
[
"5bc6e716b5d6cb35fc9687c0"
]
]
}
Grok şablonu və əlinizdə xəritələşdirilmiş məlumatlar ilə son addım onu Logstash-a əlavə etməkdir.
Logstash.conf konfiqurasiya faylının yenilənməsi
ELK yığınını quraşdırdığınız serverdə Logstash konfiqurasiyasına keçin:
sudo vi /etc/logstash/conf.d/logstash.conf
Dəyişiklikləri yapışdırın.
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" ]
}
}
Dəyişikliklərinizi saxladıqdan sonra Logstash-ı yenidən başladın və hələ də işlədiyinə əmin olmaq üçün onun statusunu yoxlayın.
sudo service logstash restart
sudo service logstash status
Nəhayət, dəyişikliklərin qüvvəyə mindiyinə əmin olmaq üçün, Kibana'da Logstash üçün Elasticsearch indeksinizi yeniləməyinizə əmin olun!
Grok ilə log məlumatlarınız strukturlaşdırılmışdır!
Yuxarıdakı şəkildə gördüyümüz kimi, Grok jurnal məlumatlarını Elasticsearch ilə avtomatik uyğunlaşdırmağa qadirdir. Bu, qeydləri idarə etməyi və məlumatı tez sorğulamağı asanlaşdırır. Sazlamaq üçün jurnal fayllarını araşdırmaq əvəzinə, sadəcə mühit və ya url kimi axtardığınıza görə süzgəcdən keçirə bilərsiniz.
Grok ifadələrini sınayın! Bunu etmək üçün başqa üsulunuz varsa və ya yuxarıdakı nümunələrlə bağlı hər hansı probleminiz varsa, mənə bildirmək üçün aşağıda şərh yazmağınız kifayətdir.
Oxuduğunuz üçün təşəkkürlər və daha maraqlı proqram mühəndisliyi məqalələri üçün Medium-da məni izləyin!
Resurslar
PS
Telegram kanalı tərəfindən
Mənbə: www.habr.com