Ana içeriğe geç
Kategoriye Dön

Konteyner Loglama: Docker ve Kubernetes Log Yönetimi

Docker log sürücüleri, docker logs komutu, Kubernetes pod logları, merkezi log toplama (Loki, ELK Stack), log rotasyonu ve production ortamında log yönetimi en iyi pratikleri.

Okuma süresi: 15 dk Konteyner & Orkestrasyon
dockerkubernetesloglamaloglokielkfluentdmonitoring
Yazar
REXE Teknoloji Ağ ve Güvenlik Ekibi
Editör
REXE Teknoloji Teknik Yayın Editörü
İlk yayın
Son güncelleme

Konteyner Loglama: Docker ve Kubernetes Log Yönetimi

Konteyner ortamlarında loglama, geleneksel sunucu loglamasından farklıdır. Konteynerler geçici olduğundan, logların konteyner dışında merkezi bir yerde toplanması kritik önem taşır. Bu rehberde Docker ve Kubernetes log yönetimini, merkezi log toplama çözümlerini ve production en iyi pratiklerini ele alacağız.

Docker Log Temelleri

docker logs Komutu

hljs bash
# Konteyner loglarını görüntüle
docker logs CONTAINER_NAME

# Son N satırı görüntüle
docker logs --tail 100 CONTAINER_NAME

# Canlı log takibi
docker logs -f CONTAINER_NAME

# Zaman damgası ile görüntüle
docker logs -t CONTAINER_NAME

# Belirli zamandan itibaren
docker logs --since 2024-01-01T00:00:00 CONTAINER_NAME
docker logs --since 1h CONTAINER_NAME  # Son 1 saat

# Belirli zaman aralığı
docker logs --since 2h --until 1h CONTAINER_NAME

# Canlı + zaman damgası
docker logs -f -t CONTAINER_NAME

Docker Log Sürücüleri

Docker farklı log sürücülerini destekler:

hljs bash
# Mevcut log sürücüsünü kontrol et
docker info | grep 'Logging Driver'

# Konteyner log sürücüsünü görüntüle
docker inspect CONTAINER_NAME | grep LogConfig -A 5

Log Sürücüsü Yapılandırması

hljs json
// /etc/docker/daemon.json
{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3",
    "compress": "true"
  }
}
hljs bash
# Docker daemon'ı yeniden başlat
systemctl restart docker

Konteyner Başlatırken Log Sürücüsü

hljs bash
# json-file ile log rotasyonu
docker run -d \
  --name myapp \
  --log-driver json-file \
  --log-opt max-size=10m \
  --log-opt max-file=3 \
  myapp:latest

# Syslog'a yönlendir
docker run -d \
  --name myapp \
  --log-driver syslog \
  --log-opt syslog-address=udp://localhost:514 \
  myapp:latest

# Loglama devre dışı (performans kritik)
docker run -d \
  --name myapp \
  --log-driver none \
  myapp:latest

Docker Compose ile Log Yapılandırması

hljs yaml
# docker-compose.yml
version: '3.8'

services:
  app:
    image: myapp:latest
    logging:
      driver: json-file
      options:
        max-size: "10m"
        max-file: "5"
        compress: "true"
        labels: "app,environment"
    labels:
      - "app=myapp"
      - "environment=production"

  nginx:
    image: nginx:latest
    logging:
      driver: json-file
      options:
        max-size: "5m"
        max-file: "3"

Kubernetes Pod Logları

hljs bash
# Pod loglarını görüntüle
kubectl logs POD_NAME

# Belirli container'ın logları (multi-container pod)
kubectl logs POD_NAME -c CONTAINER_NAME

# Canlı log takibi
kubectl logs -f POD_NAME

# Son N satır
kubectl logs --tail=100 POD_NAME

# Belirli zamandan itibaren
kubectl logs --since=1h POD_NAME

# Önceki container'ın logları (crash sonrası)
kubectl logs --previous POD_NAME

# Deployment'taki tüm pod'ların logları
kubectl logs -l app=myapp --all-containers

# Namespace belirterek
kubectl logs -n production POD_NAME

Merkezi Log Toplama: Loki + Grafana

Docker Compose ile Loki Stack

hljs yaml
# loki-stack.yml
version: '3.8'

services:
  loki:
    image: grafana/loki:latest
    ports:
      - "3100:3100"
    volumes:
      - loki-data:/loki
    command: -config.file=/etc/loki/local-config.yaml

  promtail:
    image: grafana/promtail:latest
    volumes:
      - /var/log:/var/log:ro
      - /var/lib/docker/containers:/var/lib/docker/containers:ro
      - ./promtail-config.yml:/etc/promtail/config.yml
    command: -config.file=/etc/promtail/config.yml

  grafana:
    image: grafana/grafana:latest
    ports:
      - "3000:3000"
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=GucluSifre123!
    volumes:
      - grafana-data:/var/lib/grafana

volumes:
  loki-data:
  grafana-data:

Promtail Yapılandırması

hljs yaml
# promtail-config.yml
server:
  http_listen_port: 9080
  grpc_listen_port: 0

positions:
  filename: /tmp/positions.yaml

clients:
  - url: http://loki:3100/loki/api/v1/push

scrape_configs:
  - job_name: docker
    docker_sd_configs:
      - host: unix:///var/run/docker.sock
        refresh_interval: 5s
    relabel_configs:
      - source_labels: ['__meta_docker_container_name']
        regex: '/(.*?)'
        target_label: 'container'
      - source_labels: ['__meta_docker_container_log_stream']
        target_label: 'logstream'

Docker Log Sürücüsü ile Loki

hljs bash
# Loki Docker plugin kur
docker plugin install grafana/loki-docker-driver:latest \
  --alias loki \
  --grant-all-permissions

# Konteyner başlatırken Loki'ye gönder
docker run -d \
  --name myapp \
  --log-driver loki \
  --log-opt loki-url="http://localhost:3100/loki/api/v1/push" \
  --log-opt loki-batch-size=400 \
  myapp:latest
hljs json
// /etc/docker/daemon.json — Tüm konteynerler için Loki
{
  "log-driver": "loki",
  "log-opts": {
    "loki-url": "http://localhost:3100/loki/api/v1/push",
    "loki-batch-size": "400",
    "loki-retries": "3",
    "loki-max-backoff": "800ms",
    "loki-timeout": "1s"
  }
}

Kubernetes'te Merkezi Loglama

Fluent Bit ile Log Toplama

hljs yaml
# fluent-bit-daemonset.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: fluent-bit
  namespace: kube-system
spec:
  selector:
    matchLabels:
      app: fluent-bit
  template:
    metadata:
      labels:
        app: fluent-bit
    spec:
      containers:
      - name: fluent-bit
        image: fluent/fluent-bit:latest
        volumeMounts:
        - name: varlog
          mountPath: /var/log
        - name: varlibdockercontainers
          mountPath: /var/lib/docker/containers
          readOnly: true
        - name: fluent-bit-config
          mountPath: /fluent-bit/etc/
      volumes:
      - name: varlog
        hostPath:
          path: /var/log
      - name: varlibdockercontainers
        hostPath:
          path: /var/lib/docker/containers
      - name: fluent-bit-config
        configMap:
          name: fluent-bit-config

Log Rotasyonu ve Disk Yönetimi

hljs bash
# Docker log dosyalarının boyutunu kontrol et
du -sh /var/lib/docker/containers/*/*-json.log

# Tüm konteyner loglarını temizle (dikkatli!)
truncate -s 0 /var/lib/docker/containers/*/*-json.log

# Belirli konteynerin logunu temizle
truncate -s 0 $(docker inspect --format='{{.LogPath}}' CONTAINER_NAME)

# Logrotate ile otomatik rotasyon
cat > /etc/logrotate.d/docker-containers << 'EOF'
/var/lib/docker/containers/*/*.log {
  rotate 7
  daily
  compress
  size=10M
  missingok
  delaycompress
  copytruncate
}
EOF

Yapılandırılmış Loglama (JSON)

hljs javascript
// Node.js — Winston ile JSON loglama
const winston = require('winston');

const logger = winston.createLogger({
  level: 'info',
  format: winston.format.combine(
    winston.format.timestamp(),
    winston.format.errors({ stack: true }),
    winston.format.json()
  ),
  transports: [
    new winston.transports.Console()
  ]
});

// Kullanım
logger.info('Kullanıcı girişi', {
  userId: 123,
  action: 'login',
  ip: '192.168.1.1'
});

logger.error('Veritabanı hatası', {
  error: err.message,
  query: 'SELECT * FROM users'
});

Sonuç

Etkili konteyner loglaması, production ortamlarında sorun tespiti ve sistem sağlığı izleme için vazgeçilmezdir. Docker'da log rotasyonu ile disk dolmasını önleyin, Loki veya ELK Stack ile merkezi log toplama kurun ve yapılandırılmış JSON logları ile log analizini kolaylaştırın. REXE sunucularında bu yapılandırmalar ile konteyner altyapınızı tam görünürlükle yönetebilirsiniz.

Sık Sorulan Sorular

Docker logları nerede saklanır?

Varsayılan json-file sürücüsü ile loglar /var/lib/docker/containers/CONTAINER_ID/CONTAINER_ID-json.log dosyasında saklanır. docker inspect CONTAINER_NAME | grep LogPath komutu ile tam yolu öğrenebilirsiniz. Log rotasyonu yapılandırmazsanız bu dosyalar zamanla disk dolmasına neden olabilir.

Konteyner silindikten sonra logları nasıl görürüm?

Konteyner silindiğinde logları da kaybolur. Bu nedenle production ortamında merkezi log toplama (Loki, ELK, Fluentd) kullanmak kritiktir. Alternatif olarak --log-driver syslog ile sistem loglarına yönlendirebilir veya uygulama içinde dosyaya yazıp volume ile kalıcı hale getirebilirsiniz.

Log rotasyonu nasıl yapılandırılır?

İki yöntem: 1) Docker daemon seviyesinde /etc/docker/daemon.json dosyasına max-size ve max-file ayarlarını ekleyin (tüm konteynerler için geçerli olur). 2) Konteyner başlatırken --log-opt max-size=10m --log-opt max-file=3 parametrelerini kullanın. Değişiklik sonrası Docker'ı yeniden başlatmayı unutmayın.

Kubernetes'te birden fazla pod'un loglarını nasıl takip ederim?

kubectl logs -l app=myapp --all-containers komutu ile label selector kullanarak birden fazla pod'un loglarını aynı anda görüntüleyebilirsiniz. Daha gelişmiş çözüm için stern veya kubetail gibi araçları kullanın. Production'da Loki veya ELK Stack ile merkezi log toplama önerilir.

JSON formatında loglama neden önemlidir?

JSON logları yapılandırılmış olduğundan Loki, Elasticsearch gibi sistemler tarafından otomatik parse edilebilir. Belirli alanlara göre filtreleme ve arama yapılabilir (örn: userId=123 olan tüm loglar). Düz metin logları ise regex ile parse edilmesi gerekir, bu hem yavaş hem de hata prone'dur.

İlgili Makaleler

Ağ TrafiğiGelen GbpsGiden Gbps