انتقل إلى المحتوى الرئيسي
العودة إلى الفئة

تسجيل الحاويات: إدارة سجلات Docker و Kubernetes

مشغلات سجلات Docker، أمر docker logs، سجلات pods في Kubernetes، جمع السجلات المركزي (Loki, ELK Stack)، تدوير السجلات وأفضل ممارسات إدارة السجلات في بيئة الإنتاج.

وقت القراءة: 15 dk الحاويات والتنسيق
dockerkubernetesتسجيلسجلlokielkfluentdمراقبة

جدول المحتويات

تسجيل الحاويات: إدارة سجلات Docker و Kubernetes

يختلف التسجيل في بيئات الحاويات عن تسجيل الخوادم التقليدية. نظراً لأن الحاويات مؤقتة، فإن جمع السجلات مركزياً خارج الحاوية أمر بالغ الأهمية. يتناول هذا الدليل إدارة سجلات Docker و Kubernetes وحلول جمع السجلات المركزية وأفضل ممارسات الإنتاج.

أساسيات تسجيل Docker

أمر docker logs

hljs bash
# عرض سجلات الحاوية
docker logs CONTAINER_NAME

# عرض آخر N سطر
docker logs --tail 100 CONTAINER_NAME

# بث السجلات المباشر
docker logs -f CONTAINER_NAME

# عرض مع الطوابع الزمنية
docker logs -t CONTAINER_NAME

# من وقت محدد
docker logs --since 1h CONTAINER_NAME  # آخر ساعة

# نطاق زمني محدد
docker logs --since 2h --until 1h CONTAINER_NAME

مشغلات سجلات Docker

hljs bash
# التحقق من مشغل السجل الحالي
docker info | grep 'Logging Driver'

إعداد مشغل السجل

hljs json
// /etc/docker/daemon.json
{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3",
    "compress": "true"
  }
}
hljs bash
# إعادة تشغيل Docker daemon
systemctl restart docker

مشغل السجل عند تشغيل الحاوية

hljs bash
# json-file مع تدوير السجلات
docker run -d \
  --name myapp \
  --log-driver json-file \
  --log-opt max-size=10m \
  --log-opt max-file=3 \
  myapp:latest

# إعادة التوجيه إلى syslog
docker run -d \
  --name myapp \
  --log-driver syslog \
  --log-opt syslog-address=udp://localhost:514 \
  myapp:latest

إعداد السجلات مع Docker Compose

hljs yaml
version: '3.8'

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

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

سجلات Pods في Kubernetes

hljs bash
# عرض سجلات الـ pod
kubectl logs POD_NAME

# حاوية محددة (pod متعدد الحاويات)
kubectl logs POD_NAME -c CONTAINER_NAME

# بث السجلات المباشر
kubectl logs -f POD_NAME

# آخر N سطر
kubectl logs --tail=100 POD_NAME

# من وقت محدد
kubectl logs --since=1h POD_NAME

# سجلات الحاوية السابقة (بعد الانهيار)
kubectl logs --previous POD_NAME

# سجلات جميع الـ pods في deployment
kubectl logs -l app=myapp --all-containers

جمع السجلات المركزي: Loki + Grafana

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=StrongPass123!
    volumes:
      - grafana-data:/var/lib/grafana

volumes:
  loki-data:
  grafana-data:

تدوير السجلات وإدارة القرص

hljs bash
# التحقق من أحجام ملفات سجلات Docker
du -sh /var/lib/docker/containers/*/*-json.log

# مسح سجل حاوية محددة
truncate -s 0 $(docker inspect --format='{{.LogPath}}' CONTAINER_NAME)

# التدوير التلقائي مع logrotate
cat > /etc/logrotate.d/docker-containers << 'EOF'
/var/lib/docker/containers/*/*.log {
  rotate 7
  daily
  compress
  size=10M
  missingok
  delaycompress
  copytruncate
}
EOF

التسجيل المنظم (JSON)

hljs javascript
// Node.js — تسجيل JSON مع Winston
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()
  ]
});

logger.info('تسجيل دخول المستخدم', {
  userId: 123,
  action: 'login',
  ip: '192.168.1.1'
});

logger.error('خطأ في قاعدة البيانات', {
  error: err.message,
  query: 'SELECT * FROM users'
});

الخلاصة

تسجيل الحاويات الفعّال ضروري لاستكشاف الأخطاء ومراقبة صحة النظام في بيئات الإنتاج. امنع امتلاء القرص بتدوير سجلات Docker، وأعدّ جمع السجلات المركزي مع Loki أو ELK Stack، وبسّط تحليل السجلات بسجلات JSON المنظمة. بهذه الإعدادات على خوادم REXE يمكنك إدارة بنيتك التحتية للحاويات برؤية كاملة.