Grafana Loki ile Merkezi Log Yönetimi: ELK’nın Hantallığından Kaçış Rehberi
Sistem yöneticilerinin ve DevOps mühendislerinin ortak rüyası nedir? Gece yarısı “Disk Full” uyarısıyla uyanmamak. Ama modern mikroservis mimarilerinde observability sağlamak ve büyük log yığınları arasında arama yapmak tam bir karın ağrısı olabiliyor. Yıllarca ELK (Elasticsearch, Logstash, Kibana) üçlüsünün JVM bellek iştahıyla mücadele ettiyseniz ve hafif, dinamik, bütçe dostu bir alternatif arıyorsanız doğru yerdesiniz. Bu yazıda Grafana ekosisteminin parlayan yıldızı Loki ile ölçeklenebilir ve az maliyetli bir log management altyapısını adım adım kuracağız.
Neden Loki? (Yani neden Elasticsearch değil?)
Elasticsearch harika bir arama motorudur, bunu kimse inkar edemez. Ancak log yönetiminde Elasticsearch her şeyi (log satırının tamamını) indexler. Bu da büyük index boyutlarına ve dolayısıyla korkunç bir RAM tüketimine yol açar. Kendi sunucularında ELK koşturanlar, Elasticsearch pod’unun 16GB RAM’i “kahvaltı niyetine” tükettiğini çok iyi bilir.
Loki ise farklı bir felsefe benimser: “Prometheus, ama loglar için.”
Loki log içeriğinin tamamını indexlemez. Yalnızca logların metadata’sını (yani label/etiketlerini; örneğin app="nginx", env="production") indexler. Log satırlarının kendisini ise sıkıştırılmış chunk’lar halinde doğrudan nesne depolama servislerinde (AWS S3, Google Cloud Storage veya lokalde MinIO) saklar. Bu yaklaşımın kazandırdıkları şunlar:
- Düşük altyapı maliyeti: RAM tüketimi MB’lar seviyesine düşer, disk maliyeti ise S3 kullanımı sayesinde neredeyse devede kulak kalır.
- Kolay korelasyon: Prometheus metriklerinizle aynı etiketleri (labels) kullanarak metrikten loga tek tıkla geçiş yapabilirsiniz.
- Kolay ölçeklenme: Loki’nin mikroservis mimarisi sayesinde yazma (ingester) ve okuma (querier) katmanlarını birbirinden bağımsız ölçekleyebilirsiniz.
Sistem mimarisi: parçaları birleştirelim
Loki tek başına çalışmaz. Log yönetim sistemimiz üç temel bileşenden oluşur:
- Promtail (Agent): Logları toplar, etiketler (labeling) ve Loki’ye push eder (Kubernetes’te her node üzerinde bir DaemonSet olarak koşar).
- Loki (Veri Deposu): Gelen logları alır, indeksler ve depolar.
- Grafana (Görselleştirme): Loki’yi bir datasource olarak ekler, LogQL sorguları yazar ve dashboard’lar oluştururuz.
Adım adım kurulum: Kubernetes üzerinde Loki ve Promtail
Lafı uzatmadan klavyenin başına geçelim. Kurulum için en pratik yol Helm kullanmaktır. Kubernetes cluster’ınızın hazır olduğunu varsayarak başlıyoruz.
1. Helm depolarını ekleme
İlk olarak Grafana’nın resmi Helm reposunu sistemimize ekleyelim ve güncelleyelim:
helm repo add grafana https://grafana.github.io/helm-charts
helm repo update
2. Loki kurulumu
Üretim ortamı için Loki’yi S3 entegrasyonuyla kurmak en doğrusudur. Biz bu yazıda pratik olsun diye lokal disk (StatefulSet) kullanan basit bir kurulum yapacağız. Aşağıdaki loki-values.yaml dosyasını oluşturalım:
loki:
commonConfig:
replication_factor: 1
storage:
type: 'filesystem'
auth_enabled: false
singleBinary:
replicas: 1
persistence:
enabled: true
size: 10Gi
storageClassName: "standard" # Kendi storage class'ınızla değiştirin
Şimdi Loki’yi bu konfigürasyonla kuralım:
helm install loki grafana/loki -f loki-values.yaml --namespace logging --create-namespace
3. Promtail kurulumu
Promtail, Kubernetes cluster’ındaki pod loglarını otomatik olarak keşfedecek şekilde konfigüre edilmiştir. promtail-values.yaml dosyamızı oluşturalım. Burada en kritik nokta Promtail’e Loki’nin adresini doğru vermektir:
config:
clients:
- url: http://loki-gateway.logging.svc.cluster.local/loki/api/v1/push
# Kubernetes namespace ve pod etiketlerini otomatik olarak loglara eklemesi için relabeling kuralları hazır gelir.
Promtail’i kuralım:
helm install promtail grafana/promtail -f promtail-values.yaml --namespace logging
LogQL 101: loglar içinde kaybolmadan arama yapmak
Artık loglarımız Loki’ye akıyor. Bunları sorgulamak için LogQL kullanacağız. Prometheus’un sorgu dili PromQL’e aşinaysanız LogQL size çocuk oyuncağı gelecektir. LogQL sorguları iki ana bölümden oluşur: Log Stream Selector ve Filter Expression.
Basit filtreleme
Belirli bir namespace altındaki, belirli bir uygulamanın loglarını çekmek ve içinde “error” geçen satırları yakalamak için:
{namespace="production", app="payment-api"} |= "error"
“timeout” içeren ama “connection” içermeyen logları istiyorsak zincirleme filtre kullanabiliriz:
{app="nginx"} |= "timeout" != "connection"
Parser ve yapılandırılmış (structured) loglar
Uygulamanız JSON formatında log üretiyorsa Loki bu logları çalışma anında (on-the-fly) ayrıştırabilir. Bu, Loki’nin en güçlü özelliklerinden biridir:
{app="auth-service"} | json | status = "500"
Yukarıdaki sorguda | json ifadesi log satırını JSON olarak parse eder ve içerideki tüm JSON anahtarlarını geçici etiketlere (labels) dönüştürür. Sonrasında status = "500" filtresiyle yalnızca HTTP 500 hatası veren istekleri süzebiliriz.
Loglardan metrik üretmek
Son 5 dakikada Nginx loglarındaki HTTP 500 hatalarının saniyedeki oranını (rate) görmek istediğinizi düşünelim. LogQL bunu yapabilir:
sum(rate({app="nginx"} | json | status =~ "5.." [5m]))
Bu sorguyu Grafana’da bir Graph panelinde çalıştırarak doğrudan loglardan türetilmiş canlı metrik grafikleri elde edebilirsiniz. Prometheus’a yük bindirmeden sağlam bir alarm altyapısı kurmuş olursunuz.
Grafana ile log görselleştirme
Logları sorgulamak için Grafana arayüzünü kullanacağız. İzlemeniz gereken adımlar şunlar:
- Grafana arayüzüne gidin ve sol menüden Connections -> Data Sources yolunu izleyin.
- Add data source butonuna tıklayın ve listeden Loki’yi seçin.
- Connection URL kısmına Loki servisinizin adresini yazın:
http://loki-gateway.logging.svc.cluster.local(Grafana aynı cluster içindeyse). - Sayfanın altındaki Save & Test butonuna tıklayın. Yeşil onay kodunu gördüyseniz bağlantı tamamdır.
Şimdi sol menüden Explore sekmesine gidin. Üst taraftan veri kaynağı olarak Loki’yi seçin. Log browser üzerinden etiketlerinizi seçerek ya da yukarıda paylaştığımız LogQL sorgularını yazarak loglarınızı canlı olarak (Live tailing) izlemeye başlayabilirsiniz.
Üretim ortamı için pratik tavsiyeler
Loki’yi production ortamında koştururken canınızın sıkılmasını istemiyorsanız şu üç kurala dikkat edin:
- Yüksek cardinality’den (high cardinality) kaçının: Loglarınıza asla
user_id,ip_addressveyarequest_idgibi binlerce benzersiz değeri olan dinamik etiketler (labels) eklemeyin. Bu, Loki’nin indeks yapısını şişirir ve sorgu performansını yerle bir eder. Bu tür dinamik verileri log satırının içinde bırakın; aramak için LogQL filtrelerini (|=veya| json) kullanın. - S3 entegrasyonu: Lokal disk yerine her zaman AWS S3 veya MinIO gibi nesne depolama çözümlerini tercih edin. Böylece log retention (logların silinme süresi) politikanızı kolayca yönetebilir ve disk dolma riskini sıfıra indirebilirsiniz.
- Query frontend kullanımı: Yoğun log sorgulaması yapılan ortamlarda Loki’yi mikroservis modunda kurup
query-frontendbileşenini etkinleştirin. Bu bileşen büyük zaman aralıklarındaki sorguları parçalara ayırarak paralel çalıştırır ve caching mekanizması sunar.
Özet
Grafana Loki, modern DevOps pratiklerinde log yönetimi için ezber bozan bir araç. ELK’nın getirdiği büyük operasyonel yük ve maliyet olmadan, yalnızca ihtiyacımız olanı indexleyerek sağlam bir observability altyapısı kurduk. Promtail ile logları topladık, LogQL ile analiz ettik, Grafana ile görselleştirdik.
Production ortamlarınızda kaynak tüketimini optimize etmek istiyorsanız Loki’ye bir şans verin. Bir sonraki yazımızda görüşmek üzere, loglarınız temiz, sistemleriniz ayakta kalsın!