C# İle Windows Servisi Loglama Sistemi Nasıl Yapılır?

C# İle Windows Servisi Loglama Sistemi Nasıl Yapılır?
C# İle Windows Servisi 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. İhtiyacınız olan temel araçlar ve kütüphaneler şunlardır:

  • Visual Studio 2022 veya üzeri (2026 güncellemeleri ile).
  • .NET 8 veya .NET 9 SDK (Modern Windows servisleri için önerilen).
  • Serilog ve Serilog.Sinks.File NuGet paketleri.
  • Windows Servis proje şablonu (Worker Service projesi).

Eski yöntem olan EventLog kullanımı yerine, merkezi ve yönetilebilir loglama kütüphanelerini tercih etmek, loglarınızı SQL Server, Elasticsearch veya dosya sistemine kolayca yönlendirmenizi sağlar.

Adım 1: Proje Yapılandırması ve Bağımlılıkların Eklenmesi

Bir Windows servisi oluştururken en modern yaklaşım "Worker Service" şablonunu kullanmaktır. Projenizi oluşturduktan sonra, NuGet paket yöneticisi üzerinden gerekli kütüphaneleri projenize dahil etmelisiniz.

dotnet add package Serilog.Extensions.Hosting
dotnet add package Serilog.Sinks.File
dotnet add package Serilog.Sinks.Console

Bu paketler, uygulamanızın yaşam döngüsü boyunca logları hem konsola hem de belirttiğiniz bir dosyaya yazmanıza olanak tanır. Bağımlılıkları eklemek, loglama altyapısının temelini oluşturur.

Adım 2: Loglama Yapılandırmasının Ayarlanması

Loglama sistemini uygulamanın giriş noktası olan Program.cs dosyasında yapılandırmak, servisin başladığı andan itibaren tüm olayları yakalamanızı sağlar. Aşağıdaki kod bloğu, servisin logları C:\Logs\ServiceLog.txt dosyasına yazmasını sağlar.

using Serilog;

var builder = Host.CreateApplicationBuilder(args);

Log.Logger = new LoggerConfiguration()
    .MinimumLevel.Information()
    .WriteTo.Console()
    .WriteTo.File("C:\\Logs\\ServiceLog.txt", rollingInterval: RollingInterval.Day)
    .CreateLogger();

builder.Logging.ClearProviders();
builder.Logging.AddSerilog();

var host = builder.Build();
host.Run();

Bu yapılandırmada rollingInterval: RollingInterval.Day parametresi, log dosyalarının her gün otomatik olarak yeni bir isimle (tarih bazlı) oluşturulmasını sağlar. Bu, disk alanının yönetimi ve eski logların arşivlenmesi için kritik bir öneme sahiptir.

Adım 3: Servis İçerisinde Loglama Kullanımı

Servis sınıfınızın içerisinde, ILogger arayüzünü kullanarak loglama yapabilirsiniz. Bu yöntem, bağımlılık enjeksiyonu (Dependency Injection) prensiplerine uygundur ve test edilebilirliği artırır.

public class Worker : BackgroundService
{
    private readonly ILogger _logger;

    public Worker(ILogger logger)
    {
        _logger = logger;
    }

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        _logger.LogInformation("Servis başlatıldı: {time}", DateTimeOffset.Now);
        
        while (!stoppingToken.IsCancellationRequested)
        {
            try {
                // İş mantığınız burada yer alır
            }
            catch (Exception ex) {
                _logger.LogError(ex, "Bir hata oluştu!");
            }
            await Task.Delay(1000, stoppingToken);
        }
    }
}

Burada LogInformation ve LogError metotlarını kullanarak log seviyelerini yönetiyoruz. Hata durumunda Exception nesnesini doğrudan loglamak, hatanın stack trace (hata izi) bilgilerini de kaydetmenizi sağlar.

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

Windows servislerinde loglama yaparken kullanabileceğiniz farklı yöntemlerin avantaj ve dezavantajlarını aşağıdaki tabloda görebilirsiniz.

Yöntem Avantaj Dezavantaj
Dosya (File) Basit, hızlı, kolay erişilebilir. Disk alanı yönetimi gerektirir.
Event Log Windows ile entegre, merkezi. Okuması ve sorgulaması zordur.
Serilog + Sink Esnek, yapılandırılmış veri (JSON). Ek kütüphane bağımlılığı.

Adım 5: Güvenlik ve Hata Yönetimi

Loglama yaparken hassas verilerin (şifreler, kişisel veriler, API anahtarları) log dosyalarına sızmadığından emin olmalısınız. Log dosyaları genellikle düz metin (plain text) olarak saklandığı için, bu verilerin güvenliği risk altındadır.

Kritik Uyarı: Üretim ortamında log dosyalarına asla kullanıcı parolası, kredi kartı bilgisi veya kişisel kimlik verisi yazmayın. Log filtreleme kurallarını kullanarak bu verileri maskeleyin.

Aşağıdaki örnek, log yazarken veriyi nasıl filtreleyebileceğinizi gösterir:

// Hassas veriyi maskeleme örneği
string maskelenmisKart = kartNo.Substring(0, 4) + "****" + kartNo.Substring(12);
_logger.LogInformation("İşlem gerçekleştirildi. Kart: {kart}", maskelenmisKart);

Adım 6: Servisi Test Etme ve Debugging

Servisinizi geliştirdikten sonra, Windows Servis Yöneticisi'ne (services.msc) yüklemeden önce konsol modunda çalıştırarak logların doğru yazılıp yazılmadığını kontrol edin. C:\Logs\ klasörünü kontrol ederek logların oluştuğundan emin olun.

// Servis hata ayıklama ipucu
#if DEBUG
    // Geliştirme ortamında ek loglama detaylarını aç
    Log.Information("Geliştirme modu aktif.");
#endif

Eğer loglar oluşmuyorsa, dizin izinlerini (Permissions) kontrol edin. Windows servisleri genellikle LocalSystem veya NetworkService hesabı ile çalıştığı için, log klasörüne yazma yetkisi olmayabilir.

Sıkça Sorulan Sorular

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

Serilog'un fileSizeLimitBytes ve retainedFileCountLimit özelliklerini kullanarak log dosyalarınızı parçalara ayırabilir ve eski logların otomatik silinmesini sağlayabilirsiniz.

Logları merkezi bir sunucuya nasıl gönderirim?

Serilog'un Serilog.Sinks.Seq veya Serilog.Sinks.Http eklentilerini kullanarak loglarınızı gerçek zamanlı olarak merkezi bir log yönetim sunucusuna gönderebilirsiniz.

Servis durduğunda loglar kaybolur mu?

Dosya tabanlı loglama kullandığınız sürece loglar diskte kalıcı olarak saklanır. Ancak, loglama kütüphanesinin buffer (tampon) ayarlarını doğru yapılandırmazsanız, servis ani bir şekilde kapandığında son loglar yazılmayabilir.

Log seviyeleri (Information, Warning, Error) ne işe yarar?

Log seviyeleri, logların önem derecesini belirler. Information genel akışı, Warning potansiyel sorunları, Error ise sistemin çalışmasını engelleyen kritik hataları temsil eder.

Performans kaybı yaşar mıyım?

Senkron loglama disk I/O işlemlerini yavaşlatabilir. Çok yoğun loglama yapılan servislerde Serilog.Sinks.Async kullanarak loglama işlemini asenkron hale getirmek performans kaybını önler.

İleri Düzey Loglama Stratejileri: Yapılandırılmış Veri (Structured Logging)

Geleneksel metin tabanlı loglama yöntemleri, hata ayıklama süreçlerinde metin ayrıştırma (parsing) zorlukları yaratabilir. Yapılandırılmış loglama, verileri JSON formatında tutarak log analiz araçlarının (Elasticsearch, Seq, Splunk) bu verileri çok daha hızlı işlemesine olanak tanır. Serilog ile bir nesneyi doğrudan loglamak, uygulamanızın çalışma anındaki durumunu anlamanızı kolaylaştırır.

// Yapılandırılmış loglama örneği
var orderData = new { OrderId = 1024, Customer = "Ahmet Yılmaz", Total = 250.50 };

// @ işareti, nesnenin özelliklerini parçalayarak (destructuring) loga ekler
Log.Information("Yeni sipariş oluşturuldu: {@OrderData}", orderData);

Bu yaklaşım sayesinde, log dosyalarınızda "OrderId" gibi alanlar üzerinden filtreleme yapabilir, belirli bir müşteriye ait tüm işlemleri saniyeler içinde listeleyebilirsiniz.

Windows Servislerinde Loglama İçin İleri İpuçları ve En İyi Uygulamalar

Windows servisleri arka planda çalıştığı için kullanıcı etkileşiminden yoksundur. Bu nedenle loglama stratejiniz, servisin "görünmez" olduğu durumlarda bile sistemin sağlığını izleyebilmelidir. İşte dikkat etmeniz gereken kritik noktalar:

  • Log Rotasyonu: Dosya boyutunun sınırsız büyümesini engellemek için rollingInterval parametresini mutlaka kullanın.
  • Bağlamsal Bilgi (Enrichment): Her log satırına Thread ID, Machine Name veya Process ID ekleyerek karmaşık servis yapılarında hangi iş parçacığının hata ürettiğini kolayca tespit edin.
  • Minimum Log Seviyesi Yönetimi: Geliştirme ortamında Debug seviyesini kullanırken, üretim (production) ortamında kaynak tüketimini azaltmak için Information veya Warning seviyesine geçiş yapın.
// Enrichment ve yapılandırma örneği
Log.Logger = new LoggerConfiguration()
    .MinimumLevel.Information()
    .Enrich.WithThreadId()
    .Enrich.WithMachineName()
    .WriteTo.File("logs/service-log-.txt", rollingInterval: RollingInterval.Day)
    .CreateLogger();

Loglama Performansını İzleme

Servisinizin loglama yaparken CPU ve Disk I/O üzerinde yarattığı yükü ölçmek için Windows Performans İzleyicisi (PerfMon) kullanılabilir. Eğer loglama işlemleri servisin ana iş mantığını (business logic) yavaşlatıyorsa, PeriodicBatchingSink kullanarak logların bellekte biriktirilip toplu halde diske yazılmasını sağlayabilirsiniz.

Yöntem Performans Etkisi Kullanım Senaryosu
Senkron Yazma Yüksek Düşük trafikli servisler
Asenkron Yazma Düşük Yüksek trafikli, kritik servisler
Batching (Toplu) Çok Düşük Yoğun veri trafiği olan sistemler
Önemli Not: Üretim ortamında log dosyalarınızın bulunduğu dizine "Network Service" veya "Local System" hesabının yazma yetkisi olduğundan emin olun. Yetki hataları, servisin sessizce çökmesine veya logların yazılamamasına neden olabilir.

Sonuç

C# ile Windows servislerinde profesyonel bir loglama sistemi kurmak, uygulamanızın güvenilirliğini artırır. Serilog gibi modern araçlar sayesinde, loglarınızı sadece metin dosyalarında değil, ihtiyaç duyduğunuz her türlü ortamda yönetebilirsiniz. Bir sonraki adım olarak, loglarınızı bir dashboard (panon) üzerinde görselleştirmek için Seq veya ELK Stack gibi araçları incelemenizi öneririm.

Sorumluluk Reddi: Bu rehberdeki kod örnekleri eğitim amaçlıdır. Üretim ortamında kullanmadan önce log dosyası izinlerini, disk kapasitesini ve veri gizliliği politikalarını (KVKK/GDPR) gözden geçirerek gerekli güvenlik yapılandırmalarını yapınız.

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

Ev yönetimi ve kendin yap (DIY) projeleri konusunda uzmanlaşmış bir içerik üreticisiyim. Detaylı rehberler hazırlayarak okuyucuların evdeki küçük sorunları profesyonel yardıma gerek duymadan çözmelerini sağlıyorum.

Yorumlar (0)

Yorum Yaz