Skip to content

Serilog/ELK Stack

Giriş

Serilog, .NET uygulamaları için yapılandırılabilir ve genişletilebilir bir logging framework'üdür. ELK Stack (Elasticsearch, Logstash, Kibana) ise log yönetimi ve analizi için kullanılan açık kaynaklı bir çözüm paketidir. Bu iki teknoloji birlikte kullanıldığında, uygulama loglarının toplanması, işlenmesi, depolanması ve görselleştirilmesi için güçlü bir altyapı sağlar.

Serilog/ELK Stack'in Önemi

  1. Merkezi Log Yönetimi
  2. Tüm logların tek bir yerde toplanması
  3. Kolay erişim ve analiz
  4. Gerçek zamanlı izleme

  5. Gelişmiş Analiz

  6. Yapılandırılmış log verileri
  7. Güçlü arama yetenekleri
  8. Özelleştirilebilir dashboardlar

  9. Ölçeklenebilirlik

  10. Yüksek hacimli log yönetimi
  11. Dağıtık mimari
  12. Yük dengeleme

Serilog Kullanımı

  1. Temel Kurulum

    // NuGet paketleri:
    // Serilog
    // Serilog.Sinks.Console
    // Serilog.Sinks.File
    // Serilog.Sinks.Elasticsearch
    
    public static class SerilogConfiguration
    {
        public static IHostBuilder UseSerilog(this IHostBuilder hostBuilder)
        {
            return hostBuilder.UseSerilog((context, services, configuration) => configuration
                .ReadFrom.Configuration(context.Configuration)
                .ReadFrom.Services(services)
                .Enrich.FromLogContext()
                .WriteTo.Console()
                .WriteTo.File("logs/log-.txt", rollingInterval: RollingInterval.Day)
                .WriteTo.Elasticsearch(new ElasticsearchSinkOptions(new Uri("http://localhost:9200"))
                {
                    AutoRegisterTemplate = true,
                    IndexFormat = "logstash-{0:yyyy.MM.dd}",
                    NumberOfShards = 2,
                    NumberOfReplicas = 1
                }));
        }
    }
    

  2. Yapılandırılmış Logging

    public class LoggingService
    {
        private readonly ILogger<LoggingService> _logger;
    
        public LoggingService(ILogger<LoggingService> logger)
        {
            _logger = logger;
        }
    
        public void LogUserAction(string userId, string action, object details)
        {
            _logger.LogInformation("User {UserId} performed {Action} with details {@Details}", 
                userId, action, details);
        }
    
        public void LogError(Exception ex, string context)
        {
            _logger.LogError(ex, "Error occurred in {Context}", context);
        }
    
        public void LogPerformance(string operation, TimeSpan duration)
        {
            _logger.LogInformation("Operation {Operation} completed in {Duration}ms", 
                operation, duration.TotalMilliseconds);
        }
    }
    

  3. Log Enrichment

    public static class LogEnricher
    {
        public static ILogger EnrichWithContext(this ILogger logger, string correlationId)
        {
            return logger.ForContext("CorrelationId", correlationId);
        }
    
        public static ILogger EnrichWithEnvironment(this ILogger logger)
        {
            return logger
                .ForContext("Environment", Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT"))
                .ForContext("MachineName", Environment.MachineName);
        }
    }
    

ELK Stack Kurulumu

  1. Elasticsearch Yapılandırması

    # elasticsearch.yml
    cluster.name: logging-cluster
    node.name: node-1
    network.host: 0.0.0.0
    http.port: 9200
    discovery.type: single-node
    

  2. Logstash Yapılandırması

    # logstash.conf
    input {
      tcp {
        port => 5000
        codec => json
      }
    }
    
    filter {
      json {
        source => "message"
      }
    }
    
    output {
      elasticsearch {
        hosts => ["http://localhost:9200"]
        index => "logstash-%{+YYYY.MM.dd}"
      }
    }
    

  3. Kibana Yapılandırması

    # kibana.yml
    server.port: 5601
    server.host: "0.0.0.0"
    elasticsearch.hosts: ["http://localhost:9200"]
    

Best Practices

  1. Log Tasarımı
  2. Yapılandırılmış log formatı
  3. Anlamlı log seviyeleri
  4. Context bilgileri
  5. Performans metrikleri

  6. Performans

  7. Asenkron logging
  8. Batch işlemler
  9. Buffer yönetimi
  10. Rate limiting

  11. Güvenlik

  12. Hassas veri filtreleme
  13. Log rotasyonu
  14. Erişim kontrolü
  15. Audit logging

  16. Monitoring

  17. Log kalitesi
  18. Sistem performansı
  19. Hata oranları
  20. Alerting

Mülakat Soruları

Temel Sorular

  1. Serilog nedir ve ne için kullanılır?
  2. Cevap: Serilog, .NET uygulamaları için yapılandırılabilir ve genişletilebilir bir logging framework'üdür. Yapılandırılmış loglama, çoklu output desteği ve zengin enrichment özellikleri sunar.

  3. ELK Stack'in bileşenleri nelerdir?

  4. Cevap:

    • Elasticsearch: Log depolama ve arama
    • Logstash: Log toplama ve işleme
    • Kibana: Log görselleştirme ve analiz
  5. Serilog'un avantajları nelerdir?

  6. Cevap:

    • Yapılandırılabilir yapı
    • Zengin sink desteği
    • Performans optimizasyonu
    • Kolay entegrasyon
  7. Log enrichment nedir?

  8. Cevap: Log enrichment, log kayıtlarına ek bilgiler ekleme işlemidir. Context bilgileri, ortam değişkenleri, performans metrikleri gibi ek bilgiler log kayıtlarına zenginlik katar.

  9. Log rotasyonu nedir?

  10. Cevap: Log rotasyonu, log dosyalarının belirli bir boyuta veya süreye ulaştığında yeni dosyalara aktarılması işlemidir. Disk alanı yönetimi ve performans için önemlidir.

Teknik Sorular

  1. Serilog nasıl yapılandırılır?
  2. Cevap:

    public static class SerilogConfiguration
    {
        public static IHostBuilder UseSerilog(this IHostBuilder hostBuilder)
        {
            return hostBuilder.UseSerilog((context, services, configuration) => configuration
                .ReadFrom.Configuration(context.Configuration)
                .ReadFrom.Services(services)
                .Enrich.FromLogContext()
                .WriteTo.Console()
                .WriteTo.File("logs/log-.txt", rollingInterval: RollingInterval.Day)
                .WriteTo.Elasticsearch(new ElasticsearchSinkOptions(new Uri("http://localhost:9200"))
                {
                    AutoRegisterTemplate = true,
                    IndexFormat = "logstash-{0:yyyy.MM.dd}",
                    NumberOfShards = 2,
                    NumberOfReplicas = 1
                }));
        }
    }
    

  3. Yapılandırılmış loglama nasıl yapılır?

  4. Cevap:

    public class LoggingService
    {
        private readonly ILogger<LoggingService> _logger;
    
        public LoggingService(ILogger<LoggingService> logger)
        {
            _logger = logger;
        }
    
        public void LogUserAction(string userId, string action, object details)
        {
            _logger.LogInformation("User {UserId} performed {Action} with details {@Details}", 
                userId, action, details);
        }
    
        public void LogError(Exception ex, string context)
        {
            _logger.LogError(ex, "Error occurred in {Context}", context);
        }
    }
    

  5. Log enrichment nasıl yapılır?

  6. Cevap:

    public static class LogEnricher
    {
        public static ILogger EnrichWithContext(this ILogger logger, string correlationId)
        {
            return logger.ForContext("CorrelationId", correlationId);
        }
    
        public static ILogger EnrichWithEnvironment(this ILogger logger)
        {
            return logger
                .ForContext("Environment", Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT"))
                .ForContext("MachineName", Environment.MachineName);
        }
    }
    

  7. Logstash pipeline nasıl yapılandırılır?

  8. Cevap:

    input {
      tcp {
        port => 5000
        codec => json
      }
    }
    
    filter {
      json {
        source => "message"
      }
      mutate {
        add_field => { "application" => "myapp" }
      }
    }
    
    output {
      elasticsearch {
        hosts => ["http://localhost:9200"]
        index => "logstash-%{+YYYY.MM.dd}"
      }
    }
    

  9. Kibana dashboard nasıl oluşturulur?

  10. Cevap:
    • Index pattern tanımlama
    • Visualization oluşturma
    • Dashboard tasarlama
    • Alert kuralları belirleme

İleri Seviye Sorular

  1. Serilog performans optimizasyonu nasıl yapılır?
  2. Cevap:

    • Asenkron logging
    • Batch işlemler
    • Buffer yönetimi
    • Rate limiting
    • Sink optimizasyonu
  3. ELK Stack ölçeklendirme stratejileri nelerdir?

  4. Cevap:

    • Cluster yapılandırması
    • Shard yönetimi
    • Replica dağıtımı
    • Load balancing
    • Cache stratejileri
  5. Log güvenliği nasıl sağlanır?

  6. Cevap:

    • Hassas veri filtreleme
    • Erişim kontrolü
    • SSL/TLS
    • Audit logging
    • Compliance
  7. Log analizi ve alerting nasıl yapılır?

  8. Cevap:

    • Anomali tespiti
    • Pattern matching
    • Threshold monitoring
    • Alert kuralları
    • Notification kanalları
  9. Log yönetimi ve arşivleme stratejileri nelerdir?

  10. Cevap:
    • Retention politikaları
    • Cold storage
    • Index lifecycle
    • Backup stratejileri
    • Compliance gereksinimleri