İçeriğe Atla
Mustafa Erbay
Yaşam · 8 dk okuma · görüntülenme

Log Seviye Stratejileri: Gözlemlenebilirlik ve Maliyet Dengesi

Sistemlerimizde log seviyelerini doğru ayarlayarak hem gözlemlenebilirliği artırın hem de maliyetleri kontrol altında tutun. Deneyimlerimle pratik bir rehber.

100%

Log Seviye Stratejileri: Gözlemlenebilirlik ve Maliyet Dengesi Nasıl Kurulur?

Bir üretim ERP’sinde gec sevkiyat raporu hep eksik geliyordu. Sebebini bulmak günlerce sürdü. Bu tür durumlar, sistemlerimizin içinde neler olup bittiğini ne kadar iyi anlayabildiğimizle doğrudan ilgili. Loglar, bu anlayışın temel taşı. Ancak her şeyi kaydetmek hem mantıksız hem de maliyetli. İşte bu noktada doğru log seviye stratejilerini belirlemek kritik hale geliyor. Bu yazıda, sistemlerimizde gözlemlenebilirliği en üst düzeye çıkarırken maliyetleri de kontrol altında tutmanın yollarını kendi deneyimlerimden yola çıkarak anlatacağım.

Doğru log seviyesini belirlemek, sadece teknik bir konu değil, aynı zamanda stratejik bir karar. Aşırı detaylı loglar, depolama ve analiz maliyetlerini hızla artırırken, yetersiz loglar ise sorun anında hata ayıklamayı imkansız hale getirebilir. Bu dengeyi kurmak, sistemlerimizin sağlığını ve operasyonel verimliliğimizi doğrudan etkiliyor. Bu dengeyi nasıl kurduğumu adım adım inceleyelim.

Farklı Log Seviyelerinin Anlamı ve Kullanım Alanları

Log seviyeleri, bir olayın ciddiyetini ve önemini belirtmek için kullanılır. Genellikle standartlaşmış seviyeler vardır ve bu seviyeler, hangi bilginin ne zaman kaydedilmesi gerektiği konusunda bir rehber sunar. Bu seviyeleri doğru anlamak, loglama stratejimizin temelini oluşturur.

En yaygın kullanılan log seviyeleri şunlardır:

  • DEBUG (Hata Ayıklama): En detaylı seviyedir. Genellikle geliştirme ve hata ayıklama süreçlerinde kullanılır. Bir değişkenin değerini, fonksiyon çağrılarını, döngülerin adımlarını vb. içerir. Üretim ortamında sürekli açık bırakılması önerilmez.
  • INFO (Bilgi): Uygulamanın normal işleyişini gösteren mesajlardır. Bir kullanıcının giriş yapması, bir işlemin başarıyla tamamlanması gibi durumları kaydeder. Gözlemlenebilirlik için önemli bir seviyedir.
  • WARN (Uyarı): Potansiyel sorunları veya beklenmedik durumları belirtir, ancak uygulamanın çalışmasını doğrudan engellemez. Örneğin, bir veritabanı bağlantısının geçici olarak kesilmesi gibi. Bu seviyedeki loglar, proaktif müdahale için kritiktir.
  • ERROR (Hata): Uygulamanın bir fonksiyonunu yerine getirememesine neden olan hataları kaydeder. Bir isteğin işlenememesi, bir dosyanın bulunamaması gibi durumlar bu seviyededir. Sorun giderme için ilk bakılması gereken yerlerden biridir.
  • FATAL (Kritik Hata): Uygulamanın tamamen durmasına neden olabilecek en ciddi hataları ifade eder. Genellikle uygulamanın sonlanmasına yol açan durumlardır.

Bu seviyelerin her birinin belirli bir amacı vardır. Örneğin, DEBUG seviyesindeki loglar, yeni bir özelliği test ederken geliştirme sürecinde paha biçilmezdir. Ancak aynı logları üretim ortamında sürekli toplamak, gereksiz yere disk alanı tüketir ve log analizini yavaşlatır. Bu yüzden, her ortam (geliştirme, test, üretim) için uygun log seviyelerini belirlemek hayati önem taşır.

Üretim Ortamında Log Seviyesi Seçimi: Gözlemlenebilirlik vs. Maliyet

Üretim ortamı, en hassas dengeyi kurmamız gereken yerdir. Bir yandan, sistemimizde neler olup bittiğini anlamak, olası sorunları erken tespit etmek ve hızlıca müdahale edebilmek için yeterli gözlemlenebilirliğe ihtiyacımız var. Diğer yandan, sonsuz log depolamak astronomik maliyetlere yol açabilir. Bu nedenle, “ne kadar log?” sorusuna mantıklı bir cevap bulmalıyız.

Genellikle üretim ortamında INFO seviyesi başlangıç için iyi bir noktadır. Bu seviye, uygulamanın normal akışını takip etmemizi sağlar. Bir kullanıcı kaydı, bir sipariş oluşumu, bir raporun üretilmesi gibi temel olayları loglar. Ancak bu seviye, sorun anında yeterli olmayabilir. Örneğin, bir kullanıcının neden belirli bir sayfayı açamadığını anlamak için sadece INFO logları yetersiz kalabilir.

Bu noktada WARN ve ERROR seviyeleri devreye girer. WARN logları, bir şeylerin ters gidebileceğini ancak henüz büyük bir sorun olmadığını gösterir. Belki bir dış servise erişim yavaşladı, belki bir konfigürasyon dosyası beklenenden farklı okundu. Bu uyarıları dikkate almak, sorunlar daha büyük hale gelmeden önlem almamızı sağlar. ERROR logları ise doğrudan bir sorunun varlığını belirtir ve hata ayıklama için en önemli kaynaktır.

Peki ya DEBUG? Üretim ortamında DEBUG seviyesini sürekli açık tutmak, genellikle büyük bir hatadır. Kendi sistemimde bir servis için DEBUG seviyesini yanlışlıkla açık bırakmıştım. Kısa sürede disk hızla doldu ve servis yavaşlamaya başladı. Hata ayıklama sonrası INFO seviyesine dönmek, sorunu çözdü. Bu tür durumlar, maliyet ve performans açısından ciddi etkilere yol açabilir. Ancak, özel bir hata ayıklama seansı gerektiğinde, geçici olarak DEBUG seviyesine geçmek ve iş bitince tekrar eski haline döndürmek akıllıca bir yaklaşımdır.

Gerçek Dünya Senaryoları ve Örnek Log Satırları

Teorik bilgileri somutlaştırmak için bazı gerçek dünya senaryoları üzerinden ilerleyelim. Bu örnekler, farklı log seviyelerinin üretim ortamında nasıl görünebileceğini ve ne gibi bilgiler sunduğunu gösterecek.

Bir e-ticaret sitesinin ödeme işlemleriyle ilgili bir servisini ele alalım.

INFO Seviyesi Örneği: Bir kullanıcının başarıyla ödeme yapmasını kaydetmek için şu şekilde bir log görebiliriz:

2026-05-23 10:30:15 INFO [payment-service] Payment successful for order ID: 123456789. Transaction ID: TXN987654321. Amount: 150.75 EUR. User ID: user_abc.

Bu log, işlemin gerçekleştiğini, sipariş ve işlem bilgilerini ve tutarı belirtiyor. Temel bir başarı kaydı için yeterli.

WARN Seviyesi Örneği: Ödeme sırasında bir API’ye yapılan istekte bir gecikme yaşandığında şu şekilde bir uyarı alabiliriz:

2026-05-23 10:31:02 WARN [payment-service] External payment gateway (gateway_xyz) response time exceeded threshold (1500ms). Actual time: 1850ms. Order ID: 123456789.

Bu uyarı, ödeme işleminin kendisi başarılı olsa da, bir dış servisin yavaş çalıştığını gösteriyor. Bu, gelecekteki işlemleri etkileyebilecek bir işaret.

ERROR Seviyesi Örneği: Eğer ödeme işlemi sırasında bir hata oluşursa, örneğin banka tarafından reddedilirse, şu şekilde bir log görebiliriz:

2026-05-23 10:32:45 ERROR [payment-service] Payment failed for order ID: 123456789. Reason: Bank declined transaction. Response code: 402. User ID: user_abc.

Bu hata kaydı, işlemin neden başarısız olduğunu (banka reddi) ve ilgili hata kodunu içeriyor. Bu bilgi, sorunun kaynağını bulmak için kritik.

DEBUG Seviyesi Örneği (Geçici Kullanım): Eğer bir hata ayıklama seansı sırasında DEBUG seviyesini açarsak, çok daha detaylı bilgiler görebiliriz:

2026-05-23 10:33:10 DEBUG [payment-service] Entering process_payment_request method.
2026-05-23 10:33:10 DEBUG [payment-service] Request payload: {"order_id": "123456789", "amount": 150.75, "currency": "EUR", ...}
2026-05-23 10:33:11 DEBUG [payment-service] Calling external gateway API with payload: {"transaction_data": "...", "user_token": "..."}
2026-05-23 10:33:12 DEBUG [payment-service] Received response from gateway: {"status": "declined", "code": "402", "message": "Insufficient funds"}
2026-05-23 10:33:12 DEBUG [payment-service] Mapping gateway response to internal error code.

Gördüğünüz gibi DEBUG logları, işlemin her adımını, kullanılan verileri ve dış servislerden gelen yanıtları detaylıca gösteriyor. Bu, sorunun kaynağını kesin olarak belirlemek için çok faydalı olabilir, ancak sürekli kullanım için uygun değildir.

Loglama Maliyetlerini Yönetme Stratejileri

Loglama maliyetleri, özellikle büyük ölçekli sistemlerde önemli bir gider kalemi olabilir. Veri depolama, veri aktarımı ve log analizi araçlarının lisans ücretleri zamanla ciddi rakamlara ulaşabilir. Bu maliyetleri yönetmek için birkaç strateji izlenebilir.

İlk olarak, log seviyelerini doğru ayarlamak en temel adımdır. Üretimde DEBUG seviyesini sürekli açık tutmaktan kaçınarak başlanmalıdır. Bunun yerine, INFO, WARN ve ERROR seviyelerine odaklanmak, veri hacmini önemli ölçüde azaltacaktır.

İkinci olarak, logların saklama sürelerini (retention policies) belirlemek önemlidir. Tüm logları sonsuza kadar saklamak genellikle gereksizdir. Belirli bir süre sonra (örneğin, 30, 90 veya 180 gün), artık ihtiyaç duyulmayan eski logları otomatik olarak silmek veya daha ucuz bir depolama çözümüne taşımak maliyetleri düşürebilir. Birçok log yönetim sistemi, bu saklama politikalarını yapılandırma imkanı sunar.

Üçüncü olarak, logları filtrelemek ve toplamak için akıllıca çözümler kullanmak gerekir. Sadece gerçekten önemli olan logları merkezi bir sisteme göndermek, veri trafiğini ve depolama ihtiyacını azaltır. Örneğin, sadece ERROR ve WARN seviyesindeki logları merkezi bir loglama servisine gönderip, INFO seviyesindeki logları daha sınırlı bir süre veya sadece belirli servisler için saklamak bir seçenek olabilir.

Dördüncü olarak, log toplama araçlarının (agents) verimli çalışmasını sağlamak önemlidir. Bazı durumlarda, log toplama araçlarının kendisi de önemli bir CPU veya bellek kaynağı tüketebilir. Bu araçların konfigürasyonlarını optimize etmek ve gereksiz veri toplamasını engellemek de önemlidir.

Son olarak, alternatif loglama çözümlerini değerlendirmek faydalı olabilir. Bulut sağlayıcılarının sunduğu yönetilen loglama servisleri veya açık kaynaklı ELK Stack (Elasticsearch, Logstash, Kibana) gibi çözümler, ölçeklenebilirlik ve maliyet açısından farklı avantajlar sunabilir. Kendi VPS’imde geliştirdiğim bazı araçlarda, bu çözümlerin farklı kombinasyonlarını denedim ve her birinin kendi trade-off’ları olduğunu gördüm.

Gözlemlenebilirlik İçin İleri Seviye Loglama Teknikleri

Standart log seviyelerinin ötesinde, sistemlerimizin derinliklerine inmek ve daha fazla görünürlük elde etmek için kullanabileceğimiz ileri seviye teknikler de mevcut. Bu teknikler, özellikle karmaşık dağıtık sistemlerde veya performans kritik uygulamalarda büyük fark yaratabilir.

1. Yapılandırılmış Loglama (Structured Logging): Logları düz metin yerine JSON gibi yapılandırılmış bir formatta kaydetmek, log analizi ve sorgulama yeteneklerini inanılmaz derecede artırır. Her log girdisi, anahtar-değer çiftleri halinde bilgileri içerir. Örneğin:

{
  "timestamp": "2026-05-23T10:30:15Z",
  "level": "INFO",
  "service": "payment-service",
  "message": "Payment successful",
  "order_id": "123456789",
  "transaction_id": "TXN987654321",
  "amount": 150.75,
  "currency": "EUR",
  "user_id": "user_abc"
}

Bu yapılandırılmış loglar, log yönetim sistemleri tarafından kolayca ayrıştırılabilir ve aranabilir hale gelir. Belirli bir order_id’ye sahip tüm işlemleri veya belirli bir user_id’nin tüm aktivitelerini sorgulamak çok daha kolaylaşır.

2. Korelasyon ID’leri (Correlation IDs): Dağıtık sistemlerde, bir isteğin birden fazla servisten geçmesi yaygındır. Bir isteğin tüm yolculuğunu takip edebilmek için, isteğe benzersiz bir “korelasyon ID” atanır ve bu ID, ilgili tüm servislerdeki loglara eklenir. Böylece, belirli bir istekle ilgili tüm logları tek bir yerde toplayabiliriz.

Örneğin, bir kullanıcı isteği önce API Gateway’e gelir, oradan authentication servisine, sonra da backend servisine gider. Her servise aynı korelasyon ID’si iletilirse, o istekle ilgili tüm loglar bu ID üzerinden bulunabilir. Bu, hata ayıklama sürecini büyük ölçüde hızlandırır.

3. Metrik Toplama (Metrics Collection): Loglar genellikle olay tabanlıdır (ne oldu?). Metrikler ise sistemin durumu hakkında sürekli bilgi verir (ne kadar?). Örneğin, bir servisin saniyedeki istek sayısı (RPS), bellek kullanımı, CPU yükü gibi metrikler, sistemin genel sağlığı hakkında bilgi verir. Bu metrikler, loglarla birlikte kullanıldığında daha kapsamlı bir gözlemlenebilirlik sağlar. Prometheus gibi araçlar, metrik toplama ve görselleştirme için popülerdir.

4. İzleme (Tracing): Distributed tracing, bir isteğin bir sistem içindeki yolculuğunu uçtan uca izlemeyi sağlar. Bu, özellikle mikroservis mimarilerinde hangi servisin gecikmeye neden olduğunu veya hatanın nerede oluştuğunu anlamak için kritiktir. Jaeger veya Zipkin gibi araçlar bu konuda yardımcı olur. İzleme, logların aksine, bir isteğin tamamlanma süresini ve alt bileşenlere yapılan çağrıları gösterir.

Bu ileri seviye teknikler, başlangıçta biraz daha fazla kurulum ve konfigürasyon gerektirse de, uzun vadede sistemlerimizin daha anlaşılır, yönetilebilir ve hataya daha dayanıklı olmasını sağlarlar. Kendi geliştirdiğim yan ürünlerde, bu teknikleri uygulamak, olası sorunları çok daha hızlı tespit etmemi ve çözmemi sağladı.

Sonuç: Loglama, Bir Maraton, Sprint Değil

Log seviyeleri belirlemek, bir kerelik bir işlem değildir. Sistemler geliştikçe, iş yükleri değiştikçe ve yeni özellikler eklendikçe loglama stratejilerimizi de sürekli olarak gözden geçirmemiz gerekir. Bu, bir sprint değil, bir maraton. Önemli olan, doğru dengeyi bulmak: hem yeterli gözlemlenebilirliği sağlamak hem de maliyetleri makul seviyelerde tutmak.

Kendi deneyimlerime göre, üretim ortamında INFO, WARN ve ERROR seviyelerine odaklanmak genellikle en iyi başlangıç noktasıdır. DEBUG seviyesini ise sadece geçici hata ayıklama seansları için kullanmak, hem maliyetleri hem de performansı olumlu etkiler. Yapılandırılmış loglama ve korelasyon ID’leri gibi ileri teknikler, gözlemlenebilirliği bir üst seviyeye taşır ve karmaşık sistemlerde hata ayıklamayı kolaylaştırır.

Unutmayalım ki loglar, sistemimizin sağlığı hakkında bize bilgi veren sessiz tanıklardır. Onları doğru şekilde dinlemeyi öğrenmek, sistemlerimizi daha güvenilir ve verimli hale getirmenin anahtarıdır. Bu dengeyi kurarak, hem operasyonel maliyetleri kontrol altında tutabilir hem de beklenmedik sorunlara karşı daha hazırlıklı olabiliriz.

Paylaş:

Bu yazı faydalı oldu mu?

Yükleniyor...

Bu yazı nasıldı?

Sıkça Sorulanlar

Bu makale ile ilgili okurların sorduğu yaygın sorular.

Üretim ortamında DEBUG seviyesini nasıl ve ne zaman etkinleştiririm?
Ben genellikle DEBUG seviyesini sadece bir sorunu izole etmem gerektiğinde, kısa bir zaman diliminde aktif hâle getiririm. İlk adım olarak kod tabanımda bir feature‑flag ekleyip, bu flag’i CI/CD pipeline’ı üzerinden sadece ilgili servis için açarım. Ardından log toplama aracımda (ör. Loki) geçici bir retention süresi tanımlayıp, veri hacmini kontrol altında tutarım. Sorun çözüldükten hemen sonra flag’i kapatır, log seviyesini INFO’a geri alırım; böylece hem detaylı izleme elde ederim hem de gereksiz depolama maliyetinden kaçınırım.
INFO ve WARN seviyelerini aynı anda tutmanın maliyet ve fayda dengesi nedir?
Ben INFO ve WARN seviyelerini paralel tutarken, INFO’da iş akışının normal adımlarını, WARN’da ise potansiyel riskli ama sistemin çalışmasını engellemeyen durumları kaydederim. Bu yaklaşım, olayların zaman çizelgesini net görmemi sağlar; örneğin bir gecikme uyarısı WARN’da, işlem tamamlanması INFO’da olur. Maliyet açısından, WARN logları genellikle daha az satır içerdiği için depolama farkı minimaldir. Ancak, çok sık WARN üretmek (ör. her 5 saniyede bir) maliyeti artırabilir. Bu yüzden WARN’ı yalnızca gerçekten kritik olmayan ama dikkat gerektiren durumlar için sınırlandırırım.
Log seviyesini yanlış ayarladığımda hatayı bulamadığımda ne yapmalıyım?
Bir seferinde kritik bir entegrasyon hatasını INFO seviyesinde kaçırdığımda, önce tüm ilgili servislerde log seviyesini bir adım yükselterek DEBUG’a geçirdim ve bir gün boyunca izlemeye başladım. Bu sırada correlation‑id ekleyerek istek akışını birleştirdim; böylece hatanın hangi mikroserviste ve hangi parametreyle tetiklendiğini tespit ettim. Sorunu bulduktan sonra, sadece o bileşende DEBUG’ı kapatıp, kalıcı olarak WARN seviyesinde tutacak bir alarm kuralı ekledim. Böylece aynı hatanın tekrar kaçırılma riskini minimuma indirdim.
Tüm logları bir bulut hizmetine yönlendirmek her zaman en iyi çözüm midir?
Ben başlangıçta tüm logları doğrudan bir bulut log‑analitiği servisine (ör. AWS CloudWatch) yönlendirdim ve ilk haftalarda izleme kolaylığı çok iyiydi. Ancak zamanla veri hacmi arttıkça maliyetler katlanarak yükseldi ve GDPR gibi veri egemenliği kurallarına takılmaya başladım. Bu yüzden kritik ve yüksek hacimli logları yerel bir buffer’da (ör. ElasticSearch) tutup, sadece özet ve alarm verilerini buluta göndermeye geçtim. Böylece hem gecikmesiz yerel arama, hem de bulutun ölçeklenebilir raporlama avantajı elde ettim. Yani bulut her zaman en iyi çözüm değil; kullanım senaryosu ve maliyet analizi yapmadan karar vermek riskli.
ME

Mustafa Erbay

Sistem Mimarisi · Network Uzmanı · Altyapı, Güvenlik ve Yazılım

2006'dan bu yana sistem mimarisi, network, sunucu altyapıları, büyük yapıların kurulumu, yazılım ve sistem güvenliği ekseninde çalışıyorum. Bu blogda sahada karşılığı olan teknik deneyimlerimi paylaşıyorum.

Kişisel Notlar

Bu notlar sadece sizde saklanır. Tarayıcınızda yerel olarak tutulur.

Hazır 0 karakter

Yorumlar

Sunucu Taraflı AI Moderasyon

Yorumlar sunucuda yapay zeka ile denetlenir ve kalıcı olarak saklanır.

?
0/2000

Sunucu taraflı AI denetim

✉️ Ücretsiz · Spam yok · İstediğin an çık

Yeni yazılardan haberdar olun

Yeni içerikler ve teknik notlar e-postanıza gelsin.

  • 📌
    Haftanın en iyisi Sadece okumaya değer tek yazı
  • 🔧
    Alet çantası Bu hafta kullandığım araçlar
  • 🧠
    Perde arkası Blog'a girmeyen notlar

Spam yapmıyoruz. İstediğiniz zaman ayrılabilirsiniz. · Sadece Umami (self-hosted, Google yok) ile takip.

Okuma İstatistikleriniz

0

Yazı Okundu

0dk

Okuma Süresi

0

Gün Serisi

-

Favori Kategori

İlgili Yazılar