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

İçindekiler

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.