Logging ve Konfigürasyon Yönetimi

ASP.NET Core uygulamalarında logging (loglama) ve konfigürasyon yönetimi, uygulamanın izlenebilirliğini ve yönetilebilirliğini artıran kritik unsurlardır.

Bu bölümde:

  • Logging (Loglama) nedir?
  • ASP.NET Core’da yerleşik loglama nasıl kullanılır?
  • appsettings.json ve ortam değişkenleri ile yapılandırma yönetimi
  • Özel loglama sağlayıcıları (Serilog, NLog)
  • Pratik örnekler ve kullanım senaryoları

konularını detaylı bir şekilde inceleyeceğiz.

1. Logging (Loglama) Nedir?

Loglama, uygulamanın çalışması sırasında hata, uyarı, bilgi ve hata ayıklama mesajlarının kayıt altına alınması sürecidir.

✔ Hataları hızlı tespit etmeye yardımcı olur.
✔ Uygulamanın performansını izlemeyi sağlar.
✔ Hangi işlemlerin gerçekleştiğini kayıt altında tutar.

1.1. Log Seviyeleri

ASP.NET Core’da yerleşik olarak aşağıdaki log seviyeleri desteklenir:

SeviyeAçıklama
TraceEn düşük seviyeli detaylı loglar
DebugDebug modunda hata ayıklama logları
InformationGenel bilgi amaçlı loglar
WarningPotansiyel risk içeren durumlar
ErrorUygulamanın hata verdiği durumlar
CriticalKritik hatalar (örneğin sistem çökmesi)

📌 Genellikle “Information” ve “Warning” seviyeleri varsayılan olarak etkinleştirilir.

2. ASP.NET Core’da Yerleşik Loglama

ASP.NET Core, ILogger arayüzü üzerinden yerleşik loglama desteği sunar.

2.1. Temel Kullanım (Console Loglama)

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

var logger = app.Services.GetRequiredService<ILogger<Program>>();

app.Use(async (context, next) =>
{
    logger.LogInformation("Yeni bir HTTP isteği alındı: {Path}", context.Request.Path);
    await next();
});

app.MapGet("/", () => "Merhaba, Logging!");

app.Run();
C#

📌 Bu kod, her HTTP isteğini konsola loglar.

Örnek Çıktı (Console):

C#
info: Microsoft.AspNetCore.Hosting.Diagnostics[1]
Yeni bir HTTP isteği alındı: /
C#

2.2. Controller İçinde ILogger Kullanımı

Controller’larda ILogger bağımlılık enjeksiyonu (DI) ile kullanılabilir:

[ApiController]
[Route("api/[controller]")]
public class HomeController : ControllerBase
{
    private readonly ILogger<HomeController> _logger;

    public HomeController(ILogger<HomeController> logger)
    {
        _logger = logger;
    }

    [HttpGet]
    public IActionResult Get()
    {
        _logger.LogInformation("HomeController -> Get() çağrıldı.");
        return Ok("Loglama başarılı!");
    }
}
C#

📌 API çağrıldığında şu log mesajı üretilir:

C#
info: HomeController[0]
HomeController -> Get() çağrıldı.
C#

3. appsettings.json ile Konfigürasyon Yönetimi

ASP.NET Core uygulamalarında appsettings.json dosyası, uygulamanın konfigürasyon ayarlarını tutar.

3.1. appsettings.json Yapısı

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning"
    }
  },
  "ConnectionStrings": {
    "DefaultConnection": "Server=localhost;Database=TestDB;User Id=sa;Password=yourpassword;"
  },
  "AppSettings": {
    "ApplicationName": "My ASP.NET Core App",
    "EnableFeatureX": true
  }
}
C#

3.2. appsettings.json’dan Değer Okuma

Konfigürasyon dosyasındaki değerleri okumak için IConfiguration kullanılır.

📌 Controller içinde kullanım:

[ApiController]
[Route("api/[controller]")]
public class ConfigController : ControllerBase
{
    private readonly IConfiguration _config;

    public ConfigController(IConfiguration config)
    {
        _config = config;
    }

    [HttpGet]
    public IActionResult GetAppSettings()
    {
        var appName = _config["AppSettings:ApplicationName"];
        return Ok($"Uygulama Adı: {appName}");
    }
}
C#
C#
Uygulama Adı: My ASP.NET Core App
C#

📌 Bağlantı dizesi okumak için:

var connectionString = _config.GetConnectionString("DefaultConnection");
C#

4. Ortam Değişkenleri (Environment Variables) ile Konfigürasyon

Bazı ayarları appsettings.json yerine ortam değişkenleriyle yönetmek daha güvenlidir.

📌 Örneğin: Veritabanı şifresi .json dosyasında saklanmak yerine bir Environment Variable (Çevresel Değişken) olarak ayarlanabilir.

4.1. Ortam Değişkeni Tanımlama (Linux/Mac)

C#
export ConnectionStrings__DefaultConnection="Server=myserver;Database=prodDB;User Id=sa;Password=securePassword"
C#

📌 Windows’ta PowerShell kullanarak ayarlayabilirsiniz:

C#
$env:ConnectionStrings__DefaultConnection="Server=myserver;Database=prodDB;User Id=sa;Password=securePassword"
C#

📌 Ortam değişkenlerini okumak için:

C#
var connectionString = Environment.GetEnvironmentVariable("ConnectionStrings__DefaultConnection");
C#

5. Özel Loglama Kütüphaneleri (Serilog, NLog)

ASP.NET Core’da yerleşik loglama dışında, gelişmiş Serilog ve NLog gibi loglama kütüphaneleri kullanılabilir.

5.1. Serilog Kullanımı

Serilog, dosyaya, veritabanına veya üçüncü taraf log sistemlerine log kaydı almayı sağlar.

📌 Serilog’u projeye eklemek için:

C#
dotnet add package Serilog.AspNetCore
dotnet add package Serilog.Sinks.Console
dotnet add package Serilog.Sinks.File
C#

📌 Serilog konfigürasyonu (Program.cs)

using Serilog;

var builder = WebApplication.CreateBuilder(args);

// Serilog yapılandırması
Log.Logger = new LoggerConfiguration()
    .WriteTo.Console()
    .WriteTo.File("logs/app_log.txt", rollingInterval: RollingInterval.Day)
    .CreateLogger();

builder.Host.UseSerilog();

var app = builder.Build();
app.Run();
C#

📌 Dosyaya log kaydetme (HomeController.cs)

[ApiController]
[Route("api/[controller]")]
public class HomeController : ControllerBase
{
    private readonly ILogger<HomeController> _logger;

    public HomeController(ILogger<HomeController> logger)
    {
        _logger = logger;
    }

    [HttpGet]
    public IActionResult Get()
    {
        _logger.LogInformation("Serilog ile log kaydedildi.");
        return Ok("Log başarıyla kaydedildi!");
    }
}
C#

Loglar logs/app_log.txt dosyasına yazılacaktır.