Gereksinimler ve Ön Hazırlık
Bu projeyi hayata geçirmek için sisteminizde .NET 9 SDK'nın yüklü olması gerekmektedir. Projemizde hata yönetimi için C#'ın sunduğu güçlü "Middleware" (ara katman yazılımı) yapısını ve "Exception Handler" özelliklerini kullanacağız.
- .NET 9 SDK veya üzeri.
- Visual Studio 2022 veya VS Code (C# Dev Kit ile).
- Veri depolama için basit bir SQL Server veya JSON dosyası yapısı.
- Serilog kütüphanesi (loglama altyapısı için endüstri standardı).
Adım 1: Merkezi Hata Yakalama Middleware'i Oluşturma
Hataları tek bir noktadan yönetmek için bir Middleware sınıfı oluşturmalıyız. Bu sınıf, uygulamada gerçekleşen tüm istisnaları (exceptions) yakalayacak ve standart bir hata nesnesine dönüştürecektir.
public class ExceptionHandlingMiddleware
{
private readonly RequestDelegate _next;
public ExceptionHandlingMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task InvokeAsync(HttpContext context)
{
try
{
await _next(context);
}
catch (Exception ex)
{
await HandleExceptionAsync(context, ex);
}
}
private Task HandleExceptionAsync(HttpContext context, Exception exception)
{
context.Response.ContentType = "application/json";
context.Response.StatusCode = 500;
return context.Response.WriteAsync(new { Error = "Bir hata oluştu", Message = exception.Message }.ToString());
}
}
Bu kod bloğu, tüm HTTP isteklerini bir try-catch bloğu içerisine alır. Eğer bir hata oluşursa, kullanıcıya 500 durum koduyla standart bir JSON yanıtı döner.
Adım 2: Hata Raporlama Modelini Tasarlama
Hata raporlarının anlamlı olması için hata zamanı, kullanıcı bilgisi, hata mesajı ve stack trace (hata izi) gibi verileri tutan bir model oluşturmalıyız. Veri güvenliği için hassas bilgileri (şifreler, kredi kartı bilgileri) bu modelden temizlememiz gerekir.
public class ErrorReport
{
public Guid Id { get; set; } = Guid.NewGuid();
public DateTime Timestamp { get; set; } = DateTime.UtcNow;
public string Message { get; set; } = string.Empty;
public string StackTrace { get; set; } = string.Empty;
public string RequestPath { get; set; } = string.Empty;
public string UserIdentifier { get; set; } = "Anonymous";
}
Bu model, veritabanına kaydedilecek olan hata raporunun iskeletini oluşturur. `Timestamp` alanı, hataların kronolojik analizi için kritik öneme sahiptir.
Adım 3: Hata İzleme Sisteminde Veri Kaydı ve Güvenlik
Hataları veritabanına kaydederken SQL Injection saldırılarına karşı Entity Framework Core kullanmak en güvenli yoldur. Asla ham SQL sorguları içerisine hata mesajlarını doğrudan gömmeyin.
public async Task LogErrorToDatabase(ErrorReport report)
{
using var context = new AppDbContext();
context.ErrorReports.Add(report);
await context.SaveChangesAsync();
}
Kritik Güvenlik Uyarısı: Hata loglarını kaydederken, hata içeriğinde kullanıcıya ait e-posta, parola veya kişisel verilerin (KVKK/GDPR kapsamında) bulunmadığından emin olun. Logları sanitize etmek (temizlemek) için bir filtreleme mekanizması kullanın.
Adım 4: Serilog ile Loglama Entegrasyonu
Kendi sistemimizi kurarken, logların dosya veya dış sistemlere aktarılması için Serilog'u yapılandırmalıyız. Bu, uygulamanın o anki durumunu "debug" etmek için en iyi yöntemdir.
Log.Logger = new LoggerConfiguration()
.WriteTo.File("logs/error-log-.txt", rollingInterval: RollingInterval.Day)
.CreateLogger();
// Hata anında kullanımı:
Log.Error(exception, "Uygulamada beklenmedik bir hata oluştu: {Message}", exception.Message);
Serilog, hataları otomatik olarak günlük dosyalarına böler ve sistemin disk doluluğunu yönetmek için `RollingInterval` özelliğini kullanır.
Karşılaştırma: Hata İzleme Yöntemleri
| Yöntem | Avantajı | Dezavantajı |
|---|---|---|
| Dosya Tabanlı Loglama | Basit ve hızlıdır. | Büyük veride analiz zordur. |
| Veritabanı Loglama | Sorgulanabilir ve raporlanabilir. | Veritabanı yükünü artırır. |
| Merkezi API Loglama | Gerçek zamanlı uyarı verir. | Ağ bağımlılığı vardır. |
Adım 5: Hata Raporlama İçin Bildirim Mekanizması
Kritik hatalar oluştuğunda, sistem yöneticisine e-posta veya Slack gibi kanallardan bildirim göndermek, sistemin tepki süresini azaltır.
public void SendAlert(ErrorReport report)
{
// Basit bir SMTP istemcisi ile e-posta gönderimi
var client = new SmtpClient("smtp.mailserver.com");
client.Send("sistem@firma.com", "admin@firma.com", "Kritik Hata!", report.Message);
}
Bu yöntem, sistemin "uptime" (çalışma süresi) değerini artırmak için proaktif bir yaklaşım sağlar.
Adım 6: Sistemin Test Edilmesi
Sistemin çalışıp çalışmadığını anlamak için kasıtlı bir hata fırlatan bir endpoint oluşturun. Middleware'in bu hatayı yakalayıp loglayıp loglamadığını kontrol edin.
[HttpGet("test-error")]
public IActionResult TriggerError()
{
throw new Exception("Bu bir test hatasıdır.");
}
Bu endpoint'e istek attığınızda, Middleware devreye girecek, hatayı yakalayacak ve veritabanı/log dosyasına yazacaktır.
Sorumluluk Reddi: Bu makalede yer alan kod örnekleri eğitim amaçlıdır. Üretim ortamında (production) kullanmadan önce, hata loglarının güvenliğini, veritabanı performansını ve kişisel veri gizliliğini (KVKK) mutlaka bir güvenlik uzmanı ile gözden geçirin.
Sıkça Sorulan Sorular
Hata loglarını veritabanında tutmak performansı etkiler mi?
Evet, çok yoğun trafik alan uygulamalarda loglama işlemi ana veritabanı yerine ayrı bir "Logging Database" veya NoSQL (Elasticsearch gibi) bir yapıda tutulmalıdır.
Middleware neden hata yakalamıyor?
Middleware'in `Program.cs` içerisinde `app.UseMiddleware();` satırı ile doğru sırada (genellikle en üstte) tanımlandığından emin olun.
Stack Trace bilgisini kullanıcıya göstermeli miyim?
Kesinlikle hayır. Stack trace, sisteminizin iç yapısını ve kullandığınız kütüphaneleri ele verir; bu bir güvenlik açığıdır. Kullanıcıya sadece genel bir hata mesajı gösterin.
Hata raporlama sistemini nasıl güncel tutabilirim?
Kütüphanelerinizi (Serilog, EF Core vb.) NuGet üzerinden düzenli olarak kontrol edin ve .NET sürümünüzü LTS (Long Term Support) sürümleriyle güncelleyin.
Log dosyalarım çok büyüyor, ne yapmalıyım?
Log rotasyonu (Log Rotation) stratejisi uygulayın. Eski logları arşivleyin veya belirli bir günden eski olanları otomatik silen bir temizleme görevi (Cron Job) oluşturun.
İleri Seviye İpuçları: Log İçeriğini Zenginleştirme
Sisteminizi daha etkili hale getirmek için sadece hata mesajlarını değil, hata anındaki uygulama durumunu da yakalamalısınız. "Contextual Logging" (Bağlamsal Loglama) olarak adlandırılan bu yöntem, hatanın nedenini anlamanızı %80 oranında hızlandırır.
Log İçerisine Özel Etiketler (Enrichers) Ekleme
Serilog veya benzeri bir yapı kullanırken, her log kaydına otomatik olarak kullanıcı ID'si, IP adresi veya Request ID gibi bilgileri ekleyebilirsiniz. Bu, özellikle dağıtık sistemlerde hata takibini kolaylaştırır.
// Program.cs veya Startup.cs içerisinde
Log.Logger = new LoggerConfiguration()
.Enrich.FromLogContext()
.Enrich.WithProperty("ApplicationName", "E-Ticaret-API")
.WriteTo.Console()
.CreateLogger();
// Middleware içerisinde kapsam oluşturma
using (LogContext.PushProperty("UserId", currentUserId))
{
// Bu blok içerisindeki tüm loglar UserId bilgisini taşır
_logger.LogInformation("Kullanıcı bir işlem başlattı.");
}
Hata İzleme Sisteminde Performans Optimizasyonu
Hata yakalama mekanizması, uygulamanın ana iş akışını yavaşlatmamalıdır. Özellikle yüksek trafikli sistemlerde, senkron loglama işlemleri darboğaz yaratabilir.
Asenkron Loglama Stratejisi
Loglama işlemlerini ana iş parçacığından (main thread) ayırarak, uygulamanın yanıt süresini koruyabilirsiniz. Serilog gibi kütüphaneler için Serilog.Sinks.Async paketini kullanarak logları arka planda bir kuyruk üzerinden işleyebilirsiniz.
// Serilog Async yapılandırması
.WriteTo.Async(a => a.File("logs/myapp.txt", rollingInterval: RollingInterval.Day))
Veritabanı Loglamasında Batch (Toplu) İşlem
Eğer logları doğrudan SQL veritabanına yazıyorsanız, her hata için ayrı bir INSERT sorgusu çalıştırmak yerine, logları bellekte biriktirip belirli aralıklarla veya belirli bir sayıya ulaştığında toplu olarak (Bulk Insert) veritabanına aktarın. Bu, veritabanı üzerindeki I/O yükünü ciddi oranda azaltacaktır.
| Yöntem | Performans Etkisi | Kullanım Alanı |
|---|---|---|
| Senkron (Dosya) | Düşük | Küçük ölçekli uygulamalar |
| Asenkron (Bellek Kuyruğu) | Yüksek | Orta ve büyük ölçekli API'ler |
| Toplu (Batch) Veritabanı | Orta | Yüksek trafikli kurumsal sistemler |
Önemli Not: Loglama sisteminizde hata oluşursa, bu hatanın uygulamanın kendisini çökertmemesine dikkat edin. "Fail-safe" yani hata durumunda sessizce loglamayı durduran veya geçici bir dosyaya yazan bir yedekleme mekanizması kurmak, sistemin ayakta kalmasını sağlar.
Sonuç
C# ile özel bir hata izleme ve raporlama sistemi kurmak, uygulamanızın kalitesini ve yönetilebilirliğini bir üst seviyeye taşır. Başlangıçta basit bir Middleware ile başladığınız bu yapıyı, ilerleyen süreçte merkezi bir log sunucusuna veya bulut tabanlı bir izleme servisine dönüştürebilirsiniz. Bir sonraki adım olarak, loglarınızı görselleştirmek için bir dashboard (gösterge paneli) geliştirmeyi düşünebilirsiniz.

Yorumlar (0)
Yorum Yaz