C# İle Veritabanı Bağlantısı İçin Loglama Sistemi Nasıl Yapılır?

C# İle Veritabanı Bağlantısı İçin Loglama Sistemi Nasıl Yapılır?
C# İle Veritabanı Bağlantısı İçin Loglama Sistemi Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Projeye başlamadan önce geliştirme ortamınızın güncel olduğundan emin olmalısınız. Loglama işlemlerinde endüstri standardı haline gelmiş olan Serilog kütüphanesini kullanacağız. Bu kütüphane, yapılandırılmış loglama (structured logging) desteği ile veritabanı hatalarını JSON formatında tutmanıza ve kolayca sorgulamanıza olanak tanır.

  • .NET 9 SDK veya üzeri yüklü bir geliştirme ortamı (Visual Studio 2022 veya VS Code).
  • SQL Server veya PostgreSQL gibi bir ilişkisel veritabanı yönetim sistemi.
  • NuGet paket yöneticisi üzerinden gerekli kütüphanelerin kurulması.

Öncelikle projenize gerekli paketleri eklemek için terminalinizi açın ve aşağıdaki komutları çalıştırın:

dotnet add package Serilog.AspNetCore
dotnet add package Serilog.Sinks.File
dotnet add package Serilog.Sinks.MSSqlServer

Adım 1: Loglama Arayüzünü ve Servisini Tanımlama

Loglama sisteminin uygulamanın her yerinden erişilebilir olması için bir "Dependency Injection" (Bağımlılık Enjeksiyonu) yapısı kurmalıyız. Bu, loglama mantığını iş mantığınızdan (business logic) ayırır ve kodunuzu daha test edilebilir kılar.

public interface ILoggerService
{
    void LogDatabaseError(string message, Exception ex);
    void LogInfo(string message);
}

Yukarıdaki arayüz (interface), loglama işlemlerini standartlaştırır. Şimdi bu arayüzü uygulayan sınıfı oluşturalım:

public class LoggerService : ILoggerService
{
    public void LogDatabaseError(string message, Exception ex)
    {
        Serilog.Log.Error(ex, "Veritabanı Hatası: {Message}", message);
    }

    public void LogInfo(string message)
    {
        Serilog.Log.Information("Bilgi: {Message}", message);
    }
}

Adım 2: Veritabanı Bağlantısında Hata Yakalama (Try-Catch Blokları)

Veritabanına bağlanırken oluşabilecek hataları yönetmek için try-catch bloklarını stratejik kullanmalıyız. Bağlantı dizesi (connection string) hataları, yetkilendirme sorunları veya veritabanı sunucusunun kapalı olması gibi durumları yakalamak için aşağıdaki yapıyı kullanın.

public void ConnectToDatabase(string connectionString)
{
    try 
    {
        using var connection = new SqlConnection(connectionString);
        connection.Open();
        _logger.LogInfo("Veritabanı bağlantısı başarıyla kuruldu.");
    }
    catch (SqlException ex)
    {
        _logger.LogDatabaseError("Veritabanına bağlanırken SQL hatası oluştu.", ex);
        throw; // Hatayı bir üst katmana fırlatarak uygulama akışını yönetin
    }
}

Adım 3: Loglama Yöntemlerinin Karşılaştırılması

Loglama yaparken hangi yöntemi seçeceğiniz, uygulamanızın ölçeğine göre değişir. Aşağıdaki tablo, yaygın loglama stratejilerini karşılaştırmaktadır.

Yöntem Avantajı Dezavantajı
Dosya (File) Basit, hızlı, konfigürasyon gerektirmez. Büyük dosyalarda arama yapmak zordur.
Veritabanı (SQL) Sorgulanabilir, merkezi yönetim. Veritabanı çökerse loglar kaybolabilir.
Merkezi (ELK/Seq) Gerçek zamanlı analiz, ölçeklenebilir. Ek altyapı maliyeti ve kurulum süreci.

Adım 4: Güvenli Loglama ve Hassas Veri Yönetimi

Kritik Güvenlik Uyarısı: Log dosyalarına asla kullanıcı şifreleri, kredi kartı bilgileri veya kişisel verileri (KVKK kapsamında) açık metin olarak yazmayın. Loglama yaparken hassas alanları maskelemek veya loglamadan hariç tutmak yasal zorunluluktur.

Hassas verilerin loglanmasını engellemek için Serilog'un "Destructuring" özelliklerini veya özel filtreleme mekanizmalarını kullanabilirsiniz. Aşağıda, hata mesajlarını maskeleyen basit bir örnek bulunmaktadır:

public string MaskSensitiveData(string input)
{
    // Basit bir maskeleme örneği: Sadece ilk 4 karakteri göster
    return input.Length > 4 ? input.Substring(0, 4) + "****" : "****";
}

Adım 5: Logları Veritabanına Yazdırma

Loglarınızı sadece bir dosyada tutmak yerine, bir veritabanı tablosuna yazmak, hataları SQL sorguları ile analiz etmenizi sağlar. Serilog.Sinks.MSSqlServer paketi ile bunu kolayca yapabilirsiniz.

Log.Logger = new LoggerConfiguration()
    .WriteTo.MSSqlServer(
        connectionString: "Server=myServer;Database=LogsDb;Trusted_Connection=True;",
        sinkOptions: new MSSqlServerSinkOptions { TableName = "AppLogs" })
    .CreateLogger();

Adım 6: Hata Ayıklama (Debugging) ve İzleme

Loglama sisteminizi test etmek için bilinçli olarak hatalı bir bağlantı dizesi göndererek sistemin nasıl tepki verdiğini gözlemleyin. Debug modunda logların AppLogs tablosuna düşüp düşmediğini kontrol edin.

Sorumluluk Reddi: Bu makaledeki kod örnekleri eğitim amaçlıdır. Üretim ortamında (production) kullanmadan önce hata yönetimi ve güvenlik testlerini (penetrasyon testleri) mutlaka tamamlayın. Yazılımın veritabanı güvenliği geliştiricinin sorumluluğundadır.

Sıkça Sorulan Sorular

Loglar veritabanını yavaşlatır mı?

Evet, eğer loglama işlemi senkron (eşzamanlı) yapılırsa veritabanı performansını etkileyebilir. Bu yüzden loglama işlemlerini asenkron (asynchronous) kuyruklar kullanarak yapmanızı öneririz.

Neden Serilog kullanmalıyım?

.NET'in yerleşik loglama kütüphanesi (Microsoft.Extensions.Logging) ile tam uyumludur ve yapılandırılmış loglama konusunda piyasadaki en esnek çözümdür.

Log dosyalarım çok büyürse ne yapmalıyım?

Serilog'un "Rolling File" özelliğini kullanarak log dosyalarını gün bazlı veya boyut bazlı parçalara bölebilirsiniz.

Veritabanı bağlantısı koptuğunda loglama sistemi çalışır mı?

Eğer logları aynı veritabanına yazıyorsanız çalışmaz. Bu yüzden kritik sistemlerde logları farklı bir dosyaya veya harici bir log sunucusuna (Seq, Graylog) göndermek daha güvenlidir.

SQL Injection riskine karşı loglamada ne yapmalıyım?

Loglama fonksiyonlarına parametre olarak asla doğrudan kullanıcı girdisi göndermeyin. Her zaman parametreli loglama (structured logging) kullanın.

Loglama Stratejilerinde Performans Optimizasyonu

Loglama işlemleri, veritabanı bağlantı hatalarını izlemek için kritik olsa da, yanlış yapılandırıldığında uygulamanın I/O (giriş/çıkış) performansını ciddi oranda düşürebilir. Özellikle yüksek trafikli sistemlerde, her log kaydı için senkron bir veritabanı yazma işlemi yapmak, uygulamanın yanıt süresini uzatacaktır.

Performansı korumak için Asenkron Loglama (Asynchronous Logging) yöntemini benimsemelisiniz. Bu sayede loglama işlemi ana iş parçacığını (main thread) bloklamadan arka planda gerçekleşir.

// Serilog ile asenkron loglama yapılandırması
Log.Logger = new LoggerConfiguration()
    .WriteTo.Async(a => a.MSSqlServer(
        connectionString: "YourConnectionString",
        sinkOptions: new MSSqlServerSinkOptions { TableName = "Logs" }))
    .CreateLogger();

Ayrıca, log seviyelerini (Log Levels) doğru yönetmek de sistem kaynaklarını korur. Üretim (Production) ortamında Verbose veya Debug seviyelerini kapatıp sadece Warning ve Error seviyelerini aktif tutmak, veritabanınızdaki gereksiz veri yükünü azaltacaktır.

Log Verilerini Analiz Etmek İçin İleri Teknikler

Logları veritabanına yazmak sadece ilk adımdır. Gerçek bir hata yönetimi, bu verilerin anlamlı raporlara dönüştürülmesini gerektirir. Loglarınızda Structured Logging (Yapılandırılmış Loglama) kullanarak, verileri JSON formatında saklamanız analiz süreçlerini hızlandırır.

Örneğin, veritabanı bağlantı hatalarını kategorize etmek için şu yapıyı kullanabilirsiniz:

// Yapılandırılmış loglama örneği
_logger.LogError("Veritabanı bağlantısı başarısız oldu. Hata Kodu: {ErrorCode}, Bağlantı Stringi: {ConnectionString}", 
    sqlException.Number, 
    maskedConnectionString);

Bu yöntemle, log veritabanınızda ErrorCode sütununa göre filtreleme yapabilir ve en çok hangi hata kodunun tetiklendiğini saniyeler içinde tespit edebilirsiniz. Aşağıdaki tablo, log seviyelerinin hangi durumlarda kullanılması gerektiğini özetler:

Seviye Kullanım Senaryosu
Information Bağlantı başarıyla açıldı/kapandı.
Warning Bağlantı süresi beklenenden uzun sürdü.
Error Veritabanı bağlantısı koptu veya sorgu zaman aşımına uğradı.
Critical Veritabanı sunucusuna ulaşılamıyor, sistem tamamen durdu.

Bu yaklaşımları uygulayarak, sadece hata yakalayan değil, aynı zamanda sistemin darboğazlarını önceden haber veren proaktif bir izleme mekanizmasına sahip olursunuz.

Sonuç

C# ile veritabanı bağlantısı için loglama sistemi kurmak, uygulamanızın sağlığını korumak adına atacağınız en önemli adımlardan biridir. Bu rehberde öğrendiğiniz yöntemlerle, hataları sadece yakalamakla kalmayacak, aynı zamanda onları analiz ederek gelecekteki hataların önüne geçebileceksiniz. Bir sonraki adım olarak, loglarınızı görselleştiren "Grafana" veya "Seq" gibi araçları inceleyerek log yönetimini bir üst seviyeye taşıyabilirsiniz.

Bu yazıya tepkinizi paylaşın:
Zeynep Kaya

Yaşam kalitesini artıran hızlı ve etkili yöntemler üzerine içerik geliştiriyorum. Detaylara önem veren, çözüm odaklı rehberlerin öncüsüyüm.

Yorumlar (0)

Yorum Yaz